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

Поиск:

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


Эксперт
***


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

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



К примеру:

Код
#include "stdafx.h"

class SomeClass{
private:
    int* x;
public:
    SomeClass(){x = new int(10); }
    ~SomeClass(){delete x; }

};


int _tmain(int argc, _TCHAR* argv[])
{
    SomeClass* pSomeClass = new SomeClass;

    delete pSomeClass;

    return 0;
}

Такой такой код корректен? Сколько раз в данном случае отрабатывает delete?





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


Бывалый
*


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

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



1 раз будет всего смполняться!
Только этот
Код

delete pSomeClass;

чтобы удалить "х", надо вызывать деструктор! ->~SomeClass();
но чтобы праильно "х" удалалить , надо испольщовать delete[] а не delete

--------------------
Я не волшебник, я только учусь."Шлёпни в Гугл" - Афтор Былов Ю.М. 
PM MAIL   Вверх
Partizan
Дата 10.12.2006, 11:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Let's do some .NET
****


Профиль
Группа: Модератор
Сообщений: 2828
Регистрация: 19.12.2005
Где: Санкт-Петербург

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



всё правильно.... delete pSomeClass вызовет деструктор класса pSomeClass в котором в свою очередь вызовется delete x

Это сообщение отредактировал(а) Partizan - 10.12.2006, 11:49


--------------------
СУВ,
       Partizan.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
VectorMan
Дата 10.12.2006, 11:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Antihero
*


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

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



witex, уверен?

Вообще то конструкции типа
Код

x = new int(10);

означают "динамически создать элемент типа int и присвоить ему значение 10"
PM   Вверх
archimed7592
Дата 10.12.2006, 12:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


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

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



deleted

Это сообщение отредактировал(а) archimed7592 - 10.12.2006, 12:36


--------------------
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   Вверх
Daevaorn
Дата 10.12.2006, 12:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(archimed7592 @  10.12.2006,  13:35 Найти цитируемый пост)
, все правильно за исключением delete x (нужно delete [] x). 

тоже попалсяsmile VectorMan уже этот момент отметил.
PM MAIL WWW   Вверх
archimed7592
Дата 10.12.2006, 12:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


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

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



Daevaorn, да я страничку обновить забыл...тут уже все что нужно ответили 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   Вверх
Partizan
Дата 10.12.2006, 12:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Let's do some .NET
****


Профиль
Группа: Модератор
Сообщений: 2828
Регистрация: 19.12.2005
Где: Санкт-Петербург

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



=)) к стыду своему я тоже попался )))


--------------------
СУВ,
       Partizan.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
WERITAS
Дата 10.12.2006, 15:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


********
**


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

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



Rockie, 
Это тема-развод?  smile 
Цитата
Такой такой код корректен? Сколько раз в данном случае отрабатывает delete?

Код корректный, delete очищает одну переменную, созданную динамически, как уже было отмеченно выше.



--------------------
Арт-менеджер клуба, разрешивший концерт Алексея Глызина, уволен с формулировкой "Мудак"
PM MAIL   Вверх
Xenon
Дата 10.12.2006, 16:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Провакация smile Это из серии  : "Порешаем "головоломки""? smile


--------------------
user posted image  
PM MAIL   Вверх
Rockie
Дата 10.12.2006, 17:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(WERITAS @  10.12.2006,  15:23 Найти цитируемый пост)
Это тема-развод?  smile  

и не думал smile. Это не развод и не провокация, просто хотел показать, что память в конструкторе выделяется динамически. 
В данном примере delete очищает память и вызывает деструктор, в котором в свою очередь очищается память?.. Если delete будет вызыван дважды(для объекта и для переменной x), то отработает ли он по участку памяти, уже очищенной в ~SomeClass(){delete x; }. 



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


Let's do some .NET
****


Профиль
Группа: Модератор
Сообщений: 2828
Регистрация: 19.12.2005
Где: Санкт-Петербург

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



гмм....у ты думаешь после первого delete pSomeClass всё ещё будет указывать на ту же область памяти?
сомневаюсь) ооочень сомневаюсь)


--------------------
СУВ,
       Partizan.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
Daevaorn
Дата 10.12.2006, 17:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(Rockie @  10.12.2006,  18:41 Найти цитируемый пост)
и не думал 

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

Наоборот
Цитата(Rockie @  10.12.2006,  18:41 Найти цитируемый пост)
 Если delete будет вызыван дважды(для объекта и для переменной x), то отработает ли он по участку памяти, уже очищенной в ~SomeClass(){delete x; }. 

Судя по всему ты не очень хорошо понимаешь теорию.
PM MAIL WWW   Вверх
zabivator
Дата 10.12.2006, 20:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



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


Эксперт
***


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

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



Цитата(Partizan @  10.12.2006,  17:49 Найти цитируемый пост)
гмм....у ты думаешь после первого delete pSomeClass всё ещё будет указывать на ту же область памяти?сомневаюсь) ооочень сомневаюсь)


Partizan, imho в этом случае при выходе из ф-ии main() вызовется деструктор, в котором очистится память:
Код
class SomeClass{
private:
    int* x;
public:
    SomeClass(){x = new int(10); }
    ~SomeClass(){delete x; }

};


int main()
{
    SomeClass objSomeClass;

    return 0;
}



А в случае 
Код
  SomeClass* pSomeClass = new SomeClass;

    delete pSomeClass;


delete вызывает деструктор и освобождает память, выделенную под объект. А если в деструкторе уже освобождается память? вот что хотелось бы узнать..


Цитата(Daevaorn @  10.12.2006,  17:52 Найти цитируемый пост)
Судя по всему ты не очень хорошо понимаешь теорию.

Daevaorn, я плохо понимаю ваши посты. Что конкретно не устраивает, порядок слов 
Цитата
В данном примере delete очищает память и вызывает деструктор

?

Судя по всему вы много чего понимаете, но только ничего не скажете.. Ваш пост неинформативен. Хорошо я понимаю теорию, плохо ли - это оффтоп и никого не интересует, вы попросту нафлудили.

Это сообщение отредактировал(а) Rockie - 10.12.2006, 20:57


--------------------
Чтобы иметь большой гардероб - надо иметь большой гардероб.
PM   Вверх
Страницы: (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.1394 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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