Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

ошибка при высвобождении памяти

2.4K
28 июня 2005 года
Lenin
51 / / 05.12.2004
Здрасте.Буду краток(с):
при выполнении следующего кода
Код:
#include <iostream>
using namespace::std;
#include <stdio.h>
#include <windows.h>

int main()
{
    char buffer[]="IT'S A TEST BUFFER? I'LL TEST ITsadasdasdasda\nsdasdasdasdasdasdasdas";
    char* tBuff;
    char* buff;
    tBuff=new char;
    buff=new char;
    int i=0;
    while (buffer!=0)
        i++;
    tBuff=new char[i+1];
    i=0;
    while (buffer!=0)
    {
        tBuff=buffer;
        i++;
    }
    tBuff=0;
    cout << "T: " << tBuff << endl;
    buff=new char[i+1];
    i=0;
    while (buffer!=0)
    {
        buff=buffer;
        i++;
    }
    buff=0;
    cout << "B: " << buff << endl;
    delete[] tBuff;
    delete[] buff;
    tBuff=new char;
    buff=new char[4];
    ZeroMemory(buff,3);
    i=0;
    int i1=3;
    while (buffer!=0)
    {
        buff=buffer;
        i++;
        if (i==i1)
        {
            delete[] tBuff;
            tBuff=new char[i+1];
            ZeroMemory(tBuff,i);
            lstrcpy(tBuff,buff);
            ZeroMemory(buff,i1);
            delete[] buff;
            buff=new char[i+i1+1];
            ZeroMemory(buff,i+i1);
            lstrcpy(buff,tBuff);
            i1+=3;
        }
    }
    cout << "b: " << tBuff << endl;
    getchar();
}

в цикле while (buff!=0)
на 2 итерации при высвобождении занимаемой buff'ом памяти происходит ошибка.Прогнал под отладчиком раз 100, так и не понял в чем проблема.
3
28 июня 2005 года
Green
4.8K / / 20.01.2000
Цитата:
Originally posted by Lenin
Здрасте.Буду краток(с):
при выполнении следующего кодав цикле while (buff!=0)
на 2 итерации при высвобождении занимаемой buff'ом памяти происходит ошибка.Прогнал под отладчиком раз 100, так и не понял в чем проблема.



О боже!
Ты специально написал такой запутанный код?
Тебе обязательно было делать кучу ненужных действий? Дело в том, что весь код упрощается до нескольких строчек.

Кроме того у тебя множество утечек памяти, неправильного освобождения памяти и возможные выходы за пределы массивов.

Код:
#include <iostream>
using namespace::std;
#include <stdio.h>
#include <windows.h>

int main()
{
    char buffer[]="IT'S A TEST BUFFER? I'LL TEST ITsadasdasdasda\nsdasdasdasdasdasdasdas";
    char* tBuff;
    char* buff;
    tBuff=new char;
    buff=new char;
    int i=0;
    while (buffer!=0)
        i++;
    tBuff=new char[i+1];  // утечка
    i=0;
    while (buffer!=0)
    {
        tBuff=buffer;
        i++;
    }
    tBuff=0;
    cout << "T: " << tBuff << endl;
    buff=new char[i+1];  // утечка
    i=0;
    while (buffer!=0)
    {
        buff=buffer;
        i++;
    }
    buff=0;
    cout << "B: " << buff << endl;
    delete[] tBuff;
    delete[] buff;
    tBuff=new char;
    buff=new char[4];
    ZeroMemory(buff,3); // почему обнуляешь 3 из 4 ?
    i=0;
    int i1=3;
    while (buffer!=0)
    {
        buff=buffer;
        i++;
        if (i==i1)
        {
            delete[] tBuff;      // неправильное освобождение памяти
            tBuff=new char[i+1];
            ZeroMemory(tBuff,i); // почему обнуляешь i из i+1 ?
            lstrcpy(tBuff,buff); // в buff нет завершающего нуля
            ZeroMemory(buff,i1); // почему очищаешь 3 из 4 ?
            delete[] buff; // зачем обнулять перед удалением?
            buff=new char[i+i1+1];
            ZeroMemory(buff,i+i1); // почему обнуляешь i+i1 из i+i1+1 ?
            lstrcpy(buff,tBuff); // в tBuff возможен выход за пределы массива и нет завершающего нуля
            i1+=3;
        }
    }
    cout << "b: " << tBuff << endl;
    getchar();
}


Это какое-то домашнее задание?
Почему бы не использовать стандартные функции работы со C-style строками или даже с std::string ?
2.4K
28 июня 2005 года
Lenin
51 / / 05.12.2004
Ну вобщем я тренируюсь работать с памятью.
А нельзя поточней почему я неправильно выделяю и почему утечки?
Не все спасибо разобрался-глупая логическая ошибка:
память выделял,но занулял не всю и выходил за границу.
3
28 июня 2005 года
Green
4.8K / / 20.01.2000
Цитата:
Originally posted by Lenin
Ну вобщем я тренируюсь работать с памятью.
А нельзя поточней почему я неправильно выделяю и почему утечки?
Не все спасибо разобрался-глупая логическая ошибка:
память выделял,но занулял не всю и выходил за границу.



Несколько элементарных правил:
1) в общем случае число операторов new, должно соответствовать числу операторов delete;
2) оператору new должен соответствовать оператор delete, а оператору new[] - оператор delete[];
3) определяй переменные непосредственно перед их использованием;
4) не используй переменные несколько раз для различных целей (это я про твой i);
5) используй интуитивно понятные имена и в одной нотации;
6) не подключай библиотеки без необходимости и если в подключенных уже есть требуемые функции (memset вполне подойдет вместо ZeroMemory, а strcpy вместо lstrcpy).

Давай зарефакторим первую часть твоего кода, т.е.

Код:
char buffer[]="IT'S A TEST BUFFER? I'LL TEST ITsadasdasdasda\nsdasdasdasdasdasdasdas";
    char* tBuff;
    char* buff;
    tBuff=new char;
    buff=new char;
    int i=0;
    while (buffer!=0)
        i++;
    tBuff=new char[i+1];  // утечка
    i=0;
    while (buffer!=0)
    {
        tBuff=buffer;
        i++;
    }
    tBuff=0;
    cout << "T: " << tBuff << endl;
    buff=new char[i+1];  // утечка
    i=0;
    while (buffer!=0)
    {
        buff=buffer;
        i++;
    }
    buff=0;
    cout << "B: " << buff << endl;
    delete[] tBuff;
    delete[] buff;
}

превращается в
Код:
#include <iostream>
#include <stdio.h>

using namespace::std;

int main()
{
    const char constString[]="IT'S A TEST BUFFER? I'LL TEST ITsadasdasdasda\nsdasdasdasdasdasdasdas";

    int stringSize=0;
    while (constString[stringSize]!=0) stringSize++;
    stringSize++;
   
    char* tempBuffer=new char[stringSize];
    for(int i=0; tempBuffer = constString; ++i);
    cout << "T: " << tempBuffer << endl;


    char* buffer=new char[stringSize];
    for(int i=0; buffer = constString; ++i);
    cout << "B: " << buffer << endl;

    delete[] tempBuffer;
    delete[] buffer;

    getchar();
}

что можно еще преобразовать к
Код:
#include <iostream>
#include <stdio.h>

using namespace::std;

int main()
{
    const char constString[]="IT'S A TEST BUFFER? I'LL TEST ITsadasdasdasda\nsdasdasdasdasdasdasdas4";

    char* tempBuffer = new char[strlen(constString)+1];
    strcpy(tempBuffer, constString);
    cout << "T: " << tempBuffer << endl;

    delete[] tempBuffer;

    getchar();
}

Я не понимаю, что ты хотел сделать во второй части своего кода. Кстати там у тебя грубая ошибка - ты удаляешь массив (delete[] buff), который ещё используешь.
2.4K
28 июня 2005 года
Lenin
51 / / 05.12.2004
Цитата:
Originally posted by Green

Я не понимаю, что ты хотел сделать во второй части своего кода. Кстати там у тебя грубая ошибка - ты удаляешь массив (delete[] buff), который ещё используешь.


да но потом его опять выделяю buff=new char[i+i1+1];
А так спасибо большое

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог