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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> вызов деструктора при delete object; не вызовет ли ошибки 
V
    Опции темы
archimed7592
Дата 10.12.2006, 20:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


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

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



Цитата(Rockie @  10.12.2006,  20:54 Найти цитируемый пост)
В данном примере delete очищает память и вызывает деструктор
порядок действий. сначала деструктор
потом удаляет


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
zabivator
Дата 10.12.2006, 21:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Rockie, повторяю еще раз: деструктор НЕ освобождает память, выделяемую динамически, либо переданную в класс извне ( через указатели/ссылки). Единственное, что уничтожается после вызова деструктора ( при достижении конца области видимости - для автоматических переменных, при вызове delete - для элементов выделенных при помощи new ) - это ЧЛЕНЫ класса - в твоем случае это УКАЗАТЕЛЬ, а никак не память, на которую он указывает.
--------------------
#include <zabivator>int main( int, char * [] ){   while( Zabivator::жив() ) Zabivator::моск()++;   return 0;}
PM MAIL WWW ICQ   Вверх
Daevaorn
Дата 10.12.2006, 22:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(Rockie @  10.12.2006,  21:54 Найти цитируемый пост)
Судя по всему вы много чего понимаете, но только ничего не скажете.. Ваш пост неинформативен. Хорошо я понимаю теорию, плохо ли - это оффтоп и никого не интересует, вы попросту нафлудили.

А Вы попросту нагадилиsmile
Цитата(Rockie @  10.12.2006,  21:54 Найти цитируемый пост)
Что конкретно не устраивает, порядок слов 

Да.
Цитата(Rockie @  10.12.2006,  21:54 Найти цитируемый пост)
delete вызывает деструктор и освобождает память, выделенную под объект. 

да
Цитата(Rockie @  10.12.2006,  21:54 Найти цитируемый пост)
 А если в деструкторе уже освобождается память? вот что хотелось бы узнать..

Там освобождается память не связанная с предыдущей. Там память на которую указывает указатель-член класса.
PM MAIL WWW   Вверх
Rockie
Дата 10.12.2006, 22:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(archimed7592 @  10.12.2006,  20:59 Найти цитируемый пост)
порядок действий. сначала деструктор потом удаляет

это понятно, было бы странно, если бы было наоборот. Надо было мне точнее выражать свои мысли и не давать повода =)
Цитата
Rockie, после отработки деструктора класса вызываются сначала деструкторы его мемберов, затем - базовых классов, соответственно в твоем случае удалятся указатель на память, а память удалять нужно руками - поэтому мы в деструкторе пишем delete x

Цитата(zabivator @  10.12.2006,  21:00 Найти цитируемый пост)
Rockie, повторяю еще раз: деструктор НЕ освобождает память, выделяемую динамически, либо переданную в класс извне ( через указатели/ссылки).

ну это я тоже понимаю
Partizan,  за минус конечно спасибо.. 

Вообще мой вопрос касается расположения объекта в памяти.

То есть объект располагается так:

_______     ____
|            |    |      |
|   obj    |    |  x  |
|            |    |___|
|            |
|            |
|______|

либо так:

_______
|            |
|   obj    |
|            |
|            |
|     x     |
|______|

?
Если так, как во втором случае - то получается что память, выделенная под x удаляется дважды либо нет? 
Вот о чем я спрашивал.


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


Бывалый
*


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

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



Rockie, нет,дважды она не удаляется. Я чувствую, ты просто не понимаешь, что указатель - это не память, на которую он указывает. На одну и ту же память ссылаться может куча указателей. Суть не в этом. Память выделенная при помощи new, должна освобождаться при помощи delete. В классе у тебя не память лежит, а лшь указатель на нее. ПО этому указателю, раз уж ты в конструкторе вызвал new, нужно вызвать delete. Еще раз: указатель - отдельный объект, в котором хранится адрес выделеной тобою памяти. Автомтически удалится указатель, т.е. адрес. Но память-то никуда не денется. Ее руками чистить надо.
--------------------
#include <zabivator>int main( int, char * [] ){   while( Zabivator::жив() ) Zabivator::моск()++;   return 0;}
PM MAIL WWW ICQ   Вверх
Rockie
Дата 10.12.2006, 23:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



zabivator, я тоже понимаю разницу между указателем и выделенной под него памятью, а также что такое new, delete, конструктор, int, main()..  smile 


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


Бывалый
*


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

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



Rockie, тогда откуда такие странные вопросы? Почему тебе кажется, что она могла удалиться второй раз?
--------------------
#include <zabivator>int main( int, char * [] ){   while( Zabivator::жив() ) Zabivator::моск()++;   return 0;}
PM MAIL WWW ICQ   Вверх
archimed7592
Дата 11.12.2006, 00:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


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

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



Rockie, вот какая ситуация
Код
   obj                    *x
----------         ----------------
| int *x | =====>  | int untitled |
----------         ----------------

delete obj делает две вещи:
1. вызывает деструктор. деструктор удаляет *x т. е. освобождает выделеную в конструкторе память.
2. удаляет выделенную под объект память. эта память выделенная под указатель x. не под объект на который указывает x.



--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
Rockie
Дата 11.12.2006, 01:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата
delete obj делает две вещи:
1. вызывает деструктор. деструктор удаляет *x т. е. освобождает выделеную в конструкторе память.
2. удаляет выделенную под объект память. эта память выделенная под указатель x. не под объект на который указывает x.

archimed7592, да, и об этом же, начиная с первого поста.  smile 
Так вот предположим, что у нас есть сложный объект, который содержит данные. Для некоторых элементов  в нем память выделяется динамически, как 
int* x = new int(10);
Для наглядности можно добавить какие-нибудь другие данные, любые, к примеру
int  y, z; // и тд.
Объект класса тоже создаем динамический:
SomeClass* pSomeClass = new SomeClass;

Насколько я понимаю, delete знает где находится объект и размер объекта. Имея эту информацию можно освободить память, занимаемую объектом. Так вот возможна ли ситуация, что объект в памяти расположится таким образом:

   *obj    
--------------- 
| int *x        |
|                  |
|      ----       |
|     | x  |      |
|      ----       |
|                  |
| int  y         |
| int  z         |
| int* f         |
|                  |
----------------

В деструкторе освободится память, выделенная под
int* x;
а затем будет освобождена память, выделенная под сам объект. Тогда получается, что участок памяти 
      ----       
     | x  |      
      ----       
очищается дважды.
Либо такая ситуация невозможна и объекта класса будет обязательно размещен в памяти отдельно от объекта x. Я спрашивал об этом, а не об основах C++ и уж тем паче не собирался получать за это минусы =)




Это сообщение отредактировал(а) Rockie - 11.12.2006, 01:56


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


Бывалый
*


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

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



Rockie, ни разу неправильно. Память, выделенная при помощи new int распологается не после указателя, а где придется ( там, где ее new разместит ). Сначала память выделится под все члены класса, а потом уже начнет работать конструктор. Т.е. память выделенная new int не может оказаться между указателем и остальными мемберами.
--------------------
#include <zabivator>int main( int, char * [] ){   while( Zabivator::жив() ) Zabivator::моск()++;   return 0;}
PM MAIL WWW ICQ   Вверх
Rockie
Дата 11.12.2006, 02:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(zabivator @  11.12.2006,  01:55 Найти цитируемый пост)
Rockie, ни разу неправильно.

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

Цитата(zabivator @  11.12.2006,  01:55 Найти цитируемый пост)
 Сначала память выделится под все члены класса, а потом уже начнет работать конструктор. Т.е. память выделенная new int не может оказаться между указателем и остальными мемберами.

вот! smile такой ответ я и имел в виду, спасибо!


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


Бывалый
*


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

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



Rockie, т.е. ты это и так понимал? Или что? Или про этот ньюнанс забыл?
Пожалуйста.
--------------------
#include <zabivator>int main( int, char * [] ){   while( Zabivator::жив() ) Zabivator::моск()++;   return 0;}
PM MAIL WWW ICQ   Вверх
archimed7592
Дата 11.12.2006, 02:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


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

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



Rockie, если ты знаешь основы c++, т. е. знаешь, что память под объект выделяется до вызова конструктора, а также знаешь, что new выделяет память не где попало, а там где свободно, то непонятно зачем было задавать вопрос...фсё таки с основами туговато smile


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
zabivator
Дата 11.12.2006, 02:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



archimed7592, там таких ньюнансов до фига и больше, с опытом придет =)

Это сообщение отредактировал(а) zabivator - 11.12.2006, 02:10
--------------------
#include <zabivator>int main( int, char * [] ){   while( Zabivator::жив() ) Zabivator::моск()++;   return 0;}
PM MAIL WWW ICQ   Вверх
archimed7592
Дата 11.12.2006, 03:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


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

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



zabivator, согласен smile я поначалу думал, что конструктор с деструктором - специальные ф-ции, которые и занимаются работой с памятью smile и для меня было тайной покрытой мраком, когда эти "спец" ф-ции вызываются smile


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
Страницы: (3) Все 1 [2] 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
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.0600 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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