Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Ошибка памяти при очистке памяти


Автор: MaxWave 27.7.2006, 18:38
Никак не пойму, что я делаю не правильно? При удалении tempList ошибка о повреждениии памяти:
Код

class CVectList 
{
public:
    CVectList()
    {
        count=0;
        mList=NULL;
        tempList=NULL;
    };
    ~CVectList(){};

    void Add (BaseVector*data)
    {
        tempList=mList;
        mList=new BaseVector*[count];

        for (int i=0;i<count;i++)
        {
            mList[i]=tempList[i];
        }
        delete[] tempList;<-----здесь ошибка  (HEAD CORRUPTION DETECTED)

        mList[count]=data;
        count++;
    };
    
private:
    int count;
    BaseVector** tempList;
    BaseVector** mList;
};
 

Автор: vinter 27.7.2006, 19:20
Попробуй вместо этого
Цитата

BaseVector** tempList;    
 BaseVector** mList;

Поставить вот это:
Код

BaseVector* tempList;    
  BaseVector* mList;
 

Автор: Rockie 27.7.2006, 19:23
у тебя точки с запятыми на каждом шагу, а нужно после определения класса. 
Цитата(MaxWave @  27.7.2006,  18:38 Найти цитируемый пост)
 tempList=mList;

здесь ты присвоил один (нулевой) указатель другому? а потом mList после new  указывает на другой участок памяти;

Цитата(MaxWave @  27.7.2006,  18:38 Найти цитируемый пост)
   tempList=mList;    
        mList=new BaseVector*[count];  
        for (int i=0;i<count;i++)    
        {    
            mList[i]=tempList[i];  // откуда взялся массив tempList?
        }    
        // потом ты удаляешь массив tempList, хотя выделял для mList 
        delete[] tempList;<-----здесь ошибка  (HEAD CORRUPTION DETECTED)

в любом случае код неполный

Цитата
 mList[count]=data;
 а это выход за предел массива, нумерация-то с нуля.
в общем нужно разобраться в том что ты хочешь делать и почитать подходящую литературу. 

Автор: NextAlex 28.7.2006, 19:48
Код


class CVectList 
{
public:
    CVectList()
    {
        count=0;
        mList=NULL;
        tempList=NULL;
    }
    ~CVectList(){
        if (tempList != NULL)
            delete[] mList;
        if (tempList != NULL)
            delete[] tempList;
    }

    void Add (BaseVector*data)
    {
        bool flag = false;
        if (mList != NULL){
           tempList=mList;   // при первом вызове в это равносильно tempList=NULL
           flag = true;
        }
        mList=new BaseVector*[count + 1];
        
       if (!flag){
        for (int i=0;i<count;i++)
        {
            mList[i]=tempList[i];
        }
        if (tempList != NULL)
            delete[] tempList;   // при первом вызове удалять еще нечего
        }
        mList[count]=data;
        count++;
    }
    
private:
    int count;
    BaseVector** tempList;
    BaseVector** mList;
};


думаю так должно заработать - ты пытался освободить еще не выделенную память. При первом вызове метода Add у тебя не выделена память ни под один из массивов и оба указателя (tempList и mlist) равны NULL.
а вообще, насколько я понял, ты пытаешься сварганить нечто вроде динамического массива, который уже и без того реализован в stl и называется vector  

Автор: Damarus 28.7.2006, 20:15
Цитата(NextAlex @  28.7.2006,  20:48 Найти цитируемый пост)
думаю так должно заработать - ты пытался освободить еще не выделенную память. При первом вызове метода Add у тебя не выделена память ни под один из массивов и оба указателя (tempList и mlist) равны NULL.


Не имеет значения. По стандарту delete допускает передачу нулевого указателя smile  

Автор: MaxWave 29.7.2006, 12:06
Всем спасибо за ответы! smile 

2vinter
Это динамические массивы указателей (ДМУ), поэтому так и должно быть

2NextAlex
Про вектора, списки я заню в STL, но мне надо было реализовать это вручную (задание такое)
Спасибо за исправленный код, все дело было в 
Код

mList=new BaseVector*[count];

а надо было
Код

mList=new BaseVector*[count+1];

выход за пределы массива. 

Да, подучиться мне стоит. Проблема в том, что я опускаю "законы" программирования, корректность. Надо искоренить из сознания - если код работает, не значит, чо он корректный. Если где нибудь такая лит-ра, где акцекнтированио на этом внимание - описаны нормы написания кода? (т.е. так лучше не делать, а здесь лучше так). Срочно надо повышать свой уровень, иначе мне ничего не свтит smile (перешел на 3-й курс ПРО) 

Автор: DukeCpp 29.7.2006, 13:33
Книжка попроще: С. Уэллин "Как не надо программировать на С++" (111 нерабочих и 3 рабочих программы или почему 2+2 = 5986). Довольно занятное, лёгкое чтение. 
Посерьёзнее и, конечно, классика жанра: 
Саттер Г., Александреску А.
Стандарты програмирования на С++: 101 правило и рекомендация.

Хорошая, глубокая книга, небольшая по объёму, но ёмкая по информации.

Ну и, конечно, Мейерс:
Effective C++, More Effective C++. Без комментариев, просто must have and been read smile 

Автор: NextAlex 29.7.2006, 18:43
Цитата(Damarus @  28.7.2006,  20:15 Найти цитируемый пост)
Не имеет значения. По стандарту delete допускает передачу нулевого указателя 

по стандарту возможно и допускает, но на практике это почти всегда вызывает ошибку в работе программы - сам наступал на эти грабли. 

Автор: MaxWave 29.7.2006, 19:52
2DukeCpp

Огромное спасибо за список литературы! smile Буду искать. 

Автор: Daevaorn 29.7.2006, 22:02
Цитата(NextAlex @  29.7.2006,  19:43 Найти цитируемый пост)
по стандарту возможно и допускает, но на практике это почти всегда вызывает ошибку в работе программы - сам наступал на эти грабли.  

У вас мамонто-подобный компиляторsmile На всех современных эта часть стандарта выполняется строго. 

Автор: NextAlex 31.7.2006, 09:03
Daevaorn, ну если GCC теперь считается мамонтоподобным ... может тогда Linux - это тоже что-то совершенно несуразное ? 

Автор: Daevaorn 31.7.2006, 09:38
NextAlex, давай код и версию gcc!
delete( 0 ) абсолютно легален. 

Автор: NextAlex 31.7.2006, 10:33
Daevaorn, ты знаешь, я начал писать пример и понял что был неправ, "delete NULL" ошибку не вызывает - ошибка появляется если указатель не проинициализирован, что в принципе логично ...
так что приношу свои извинения smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)