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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Деструктор 
:(
    Опции темы
zkv
Дата 17.4.2007, 14:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


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

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



Цитата(fantast @  17.4.2007,  13:55 Найти цитируемый пост)
ты уверен? 8) 

ну и я уверен  smile 

Цитата(archimed7592 @  17.4.2007,  13:47 Найти цитируемый пост)
деструктор вызовется ещё раз(!) и если в деструкторе освобождается память, то она будет освобождена дважды(!), что опять же утечки и т. п. 

десткутор вызовется два раза, к чему это приведет зависит от каждого конкретного деструктора, но ясно, что делать так не надо!
PM MAIL   Вверх
Xenon
Дата 17.4.2007, 17:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Компилятор такая штука, капризная, поэтому такие вещи лучше не делать smile UB


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


Архимед
****


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

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



Цитата(fantast @  17.4.2007,  13:55 Найти цитируемый пост)
ты уверен? 8) 
IS-3.7.3, 5.3.5


--------------------
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
Дата 17.4.2007, 17:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(archimed7592 @  17.4.2007,  13:47 Найти цитируемый пост)
Валерия, если очень хочется явно вызвать деструктор, то можно написать obj1.~my (), но учти, что когда время жизни объекта закончится, деструктор вызовется ещё раз(!) и если в деструкторе освобождается память, то она будет освобождена дважды(!), что опять же утечки и т. п. 

поэтому после очистки памяти указатель надо занулять. 

Цитата(Валерия @  16.4.2007,  23:46 Найти цитируемый пост)
А можете переделать мой пример, что бы память под value выделялась динамически, а потом высвобождалась?

Код

#include <stdafx.h>
#include <stdio.h>

class my
{
public:
    my();
    ~my();
    int* value;
    void print();
};

my::my(){
    value  = new int(5);
}

my::~my(){
    delete value;
}

void my::print(){
    printf("%d\n",*value);
}

void main()
{
    my obj1;
    obj1.print();
}





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


Архимед
****


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

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



Цитата(HappyLife @  17.4.2007,  14:06 Найти цитируемый пост)
какие я же могут быть утечки, если, удаление вызовется два раза? 
Код
#include <cstddef>
#include <iostream>
#include <ostream>


class A
{
    unsigned char *someData;
    std::size_t count;
    A ();
    A (const A &);
    A &operator = (const A &);
public:
    A (std::size_t count)
        : someData (new unsigned char [count]), count (count)
    {
        std::cout << "allocate " << count << " bytes" << std::endl;
    }
    
    ~A ()
    {
        std::cout << "deallocate " << count << " bytes" << std::endl;
        delete [] someData;
    }
};

int main ()
{
    A a (1000);
    A b (2000);
    
    a.~A ();
    
    return 0;
}

Цитата
allocate 1000 bytes
allocate 2000 bytes

deallocate 1000 bytes
deallocate 2000 bytes

deallocate 1000 bytes

как видишь - деалокация происходит дважды... т. о. в зависимости от реализации менеджера памяти могут быть и утечки и исключения и че душе угодно...

так делать нельзя (!)

Добавлено через 2 минуты и 35 секунд
Цитата(Rockie @  17.4.2007,  17:38 Найти цитируемый пост)
поэтому после очистки памяти указатель надо занулять. 
не лучшее решение 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   Вверх
Rockie
Дата 17.4.2007, 20:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(archimed7592 @  17.4.2007,  17:45 Найти цитируемый пост)
как раз таки без занулённого указателя с включенным дебаг-менеджером памяти ругнётся и ошибку можно будет найти на этапе разработки... с занулённым - ругаться права не имеет... и ошибка выявится хз когда

никогда не выявится, так как это не ошибка.




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


Архимед
****


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

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



Цитата(Rockie @  17.4.2007,  20:10 Найти цитируемый пост)
так как это не ошибка.
с точки зрения IS - да, это не ошибка...
с архитектурной точки зрения - ещё какая


--------------------
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
Дата 17.4.2007, 21:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



archimed7592, согласен. Указатель будет указывать на область памяти, где БЫЛ обьект. После уничтожения обьекта эта область может быть задействована под что-нибудь другое(к примеру системный процесс). И если повторно заюзать delete, то может случиться ОЙ. Применение же delete к зануленному указателю безопасно, поэтому если есть опасность повторного вызова delete, то указатель лучше занулять
Код

my::~my(){
    delete value;
    value = NULL;
}

Чем-то похожим вроде занимаются умные указатели..




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


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

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



Цитата(archimed7592 @  17.4.2007,  21:56 Найти цитируемый пост)
с архитектурной точки зрения - ещё какая 

Согласна. 
Несмотря на то, что удалять нулевой указатель - не ошибка, зато ошибка - дважды вызывать деструктор.
И ты не имеешь права надеяться, что в уже разрушенном объекте будет ноль на месте указателя - даже если в конкретном примере это получается именно так. 

Главное, абсолютно непонятно, ЗАЧЕМ вызывать деструктор руками? Если обязательно нужно что-то разрушить (освободить память) ДО выхода из функции - то можно а) заключить переменные в блок б) написать какой-нибудь Destroy, который и будет освобождать то, что нужно, и обнулять.




--------------------
...
PM   Вверх
archimed7592
Дата 17.4.2007, 21:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


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

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



дело больше не в том, что освобождается там память или нет, а в том, что, во-первых, если такое произошло - это уже очень плохое проектное решение(кроме редких случаев с отдельным коментарием - тех же smartpointers)...
во-вторых, в деструкторе может делаться что угодно и дважды его вызывать не нужно из тех же соображений, что и не нужно писать asm-вставки просто так, из тех же, что и не нужно писать myClass obj; delete &obj;, даже, если здесь и сейчас это работает...


--------------------
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   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
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.0553 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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