Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Ошибка памяти при очистке памяти, оператор delete 
:(
    Опции темы
MaxWave
Дата 27.7.2006, 18:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 158
Регистрация: 8.3.2006

Репутация: нет
Всего: нет



Никак не пойму, что я делаю не правильно? При удалении 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;
};
 
PM MAIL   Вверх
vinter
Дата 27.7.2006, 19:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 13
Всего: 56



Попробуй вместо этого
Цитата

BaseVector** tempList;    
 BaseVector** mList;

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

BaseVector* tempList;    
  BaseVector* mList;
 


--------------------
Мой блог
PM MAIL WWW   Вверх
Rockie
Дата 27.7.2006, 19:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1143
Регистрация: 23.4.2006

Репутация: 8
Всего: 31



у тебя точки с запятыми на каждом шагу, а нужно после определения класса. 
Цитата(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;
 а это выход за предел массива, нумерация-то с нуля.
в общем нужно разобраться в том что ты хочешь делать и почитать подходящую литературу. 


--------------------
Чтобы иметь большой гардероб - надо иметь большой гардероб.
PM   Вверх
NextAlex
Дата 28.7.2006, 19:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 121
Регистрация: 10.8.2005
Где: Украина, г. Одесс а

Репутация: 2
Всего: 3



Код


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  

Это сообщение отредактировал(а) NextAlex - 28.7.2006, 19:56
--------------------
Говорила мама: "Учись играть на скрипке". Не хотел носить ноты - будешь носить пианино ...
PM MAIL ICQ   Вверх
Damarus
Дата 28.7.2006, 20:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Awaiting Authorisation
Сообщений: 671
Регистрация: 6.5.2006

Репутация: 6
Всего: 29



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


Не имеет значения. По стандарту delete допускает передачу нулевого указателя smile  
PM MAIL ICQ Jabber   Вверх
MaxWave
Дата 29.7.2006, 12:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 158
Регистрация: 8.3.2006

Репутация: нет
Всего: нет



Всем спасибо за ответы! smile 

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

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

mList=new BaseVector*[count];

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

mList=new BaseVector*[count+1];

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

Да, подучиться мне стоит. Проблема в том, что я опускаю "законы" программирования, корректность. Надо искоренить из сознания - если код работает, не значит, чо он корректный. Если где нибудь такая лит-ра, где акцекнтированио на этом внимание - описаны нормы написания кода? (т.е. так лучше не делать, а здесь лучше так). Срочно надо повышать свой уровень, иначе мне ничего не свтит smile (перешел на 3-й курс ПРО) 
PM MAIL   Вверх
DukeCpp
Дата 29.7.2006, 13:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 40
Регистрация: 27.2.2006
Где: St.Petersburg

Репутация: нет
Всего: 1



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

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

Ну и, конечно, Мейерс:
Effective C++, More Effective C++. Без комментариев, просто must have and been read smile 
PM   Вверх
NextAlex
Дата 29.7.2006, 18:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 121
Регистрация: 10.8.2005
Где: Украина, г. Одесс а

Репутация: 2
Всего: 3



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

по стандарту возможно и допускает, но на практике это почти всегда вызывает ошибку в работе программы - сам наступал на эти грабли. 
--------------------
Говорила мама: "Учись играть на скрипке". Не хотел носить ноты - будешь носить пианино ...
PM MAIL ICQ   Вверх
MaxWave
Дата 29.7.2006, 19:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 158
Регистрация: 8.3.2006

Репутация: нет
Всего: нет



2DukeCpp

Огромное спасибо за список литературы! smile Буду искать. 
PM MAIL   Вверх
Daevaorn
Дата 29.7.2006, 22:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

Репутация: 51
Всего: 70



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

У вас мамонто-подобный компиляторsmile На всех современных эта часть стандарта выполняется строго. 
PM MAIL WWW   Вверх
NextAlex
Дата 31.7.2006, 09:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 121
Регистрация: 10.8.2005
Где: Украина, г. Одесс а

Репутация: 2
Всего: 3



Daevaorn, ну если GCC теперь считается мамонтоподобным ... может тогда Linux - это тоже что-то совершенно несуразное ? 
--------------------
Говорила мама: "Учись играть на скрипке". Не хотел носить ноты - будешь носить пианино ...
PM MAIL ICQ   Вверх
Daevaorn
Дата 31.7.2006, 09:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

Репутация: 51
Всего: 70



NextAlex, давай код и версию gcc!
delete( 0 ) абсолютно легален. 
PM MAIL WWW   Вверх
NextAlex
Дата 31.7.2006, 10:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 121
Регистрация: 10.8.2005
Где: Украина, г. Одесс а

Репутация: 2
Всего: 3



Daevaorn, ты знаешь, я начал писать пример и понял что был неправ, "delete NULL" ошибку не вызывает - ошибка появляется если указатель не проинициализирован, что в принципе логично ...
так что приношу свои извинения smile 
--------------------
Говорила мама: "Учись играть на скрипке". Не хотел носить ноты - будешь носить пианино ...
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0542 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.