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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Деструкоры,указатели, delete ; delete провоцирует вызов деструктора:(?? 
V
    Опции темы
ano360
  Дата 20.7.2006, 19:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 305
Регистрация: 22.5.2006
Где: Москва

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



Суть проблемы:
Есть класс(link), в нем указатель(*next)  на объектэтогоже класса, в ходе программы этот указатель начинает указывать на объект, этогоже класса, память для которого выделяется методом new:(next=new link;).
В деструкторе этого класса этот указатель чистится методом delete:(delete next);
Я раньше пологал, что при вызове delete, память просто чистится, а у меня при этом запускается деструктор объекта, расположенного по адресу next.
Код:
Код
#include <iostream>
#include <cstdlib>

class list{
public:
list *begin;
list *end;
list *next;
int data;
list(){begin=end=next=NULL;}
//Деструктор
~list(){cout<<"next: list *p;\n";
        list *p;
        do{
           cout<<"next: p=begin;\n";
           p=begin;
           cout<<p<<"->next="<<p->next<<"->next="<<p->next->next<<"\n";
           cout<<"next: begin=begin->next;\n";
           begin=begin->next;
           cout<<"next: delete p;\n";
           delete p;//ВЫЗЫВАЕТСЯ ДЕСТРУКТОР
           cout<<"next: }while(begin);\n";
        }while(begin);
        }

virtual void add(int i)=0;
//int virtual del()=0;
};

class LfRt:public list{
public:

virtual void add(int i){
list *newl;
newl=new LfRt;
newl->data=i;
cout<<end<<"->next="<<newl<<"\n";
if (end) end->next=newl;
end=newl;
newl->next=NULL;
if (!begin) begin=newl;

}

//int del();
};


int main()
{
LfRt ob1;
ob1.add(1);
ob1.add(2);
ob1.add(3);
      system("PAUSE");
      return 0;
}


А вот, что выводится на экран:
0x0->next=0x2224b0
0x2224b0->next=0x2224d0
0x2224d0->next=0x2224f0
Для продолжения................
next: lost *p;
next: p=begin;
0x2224b0->next=0x2224d0->next=0x2224f0
next:begin=begin->next;
next: delete p;
next: list *p;
next: p=begin;

И вылетает ошибка:Передайте микросовт об ошибке.

И з всего этого я сделал вывод, что после делите п вызывается деструктор поновой и там уже естественно при попытке перейти NULL указателю, вылетает ошибка. НО ПОЧЕМУ ВЫЗЫВАЕТСЯ ДЕСТРУКТОР smile, smile  


--------------------
Жизнь есть.
PM MAIL WWW ICQ   Вверх
sergejzr
Дата 20.7.2006, 19:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

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



Цитата(ano360 @  20.7.2006,  17:09 Найти цитируемый пост)
НО ПОЧЕМУ ВЫЗЫВАЕТСЯ ДЕСТРУКТОР

Потому что так определено стандартом. smile  


--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
ano360
Дата 20.7.2006, 19:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 305
Регистрация: 22.5.2006
Где: Москва

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



???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????
А я всегда пологал, что память просто чистится
 smile  smile  smile  


--------------------
Жизнь есть.
PM MAIL WWW ICQ   Вверх
sergejzr
Дата 20.7.2006, 19:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

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



Как ты себе представляешь чистку памяти? Для того деструктор и существует, чтобы всё запрошенное конкретным обьектом пометить как свободное. а иначе чего чистить?? 


--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
ano360
Дата 20.7.2006, 19:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 305
Регистрация: 22.5.2006
Где: Москва

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



что-то никогда не задумывался, а вообще да, логично.спасибо
 


--------------------
Жизнь есть.
PM MAIL WWW 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.0484 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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