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

Поиск:

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


Опытный
**


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

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



Код

#include <iostream.h>
#include <conio.h>

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

my::my(){
    value  = 0;
}

my::~my(){

}

void my::print()
{
    cout << value << "\n";
}

void my::inc()
{
    value++;
}

void my::dec()
{
    value--;
}

void main()
{
    clrscr();

    my obj1, obj2, obj3;
    obj1.value = 5;
    obj2.value = 10;
    obj1.inc();
    obj2.dec();
    obj3.value=obj1.value+obj2.value;
    obj3.inc();
    obj3.print();

    getch();

}


Как вызвать деструктор тот что с тильдой, что бы полностью стереть obj1 и obj2 с памяти (obj3 - оставить)
Тоесть полностью высвободить место которое занимают эти объекты.
PM MAIL   Вверх
zkv
Дата 16.4.2007, 23:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


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

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



Цитата(Валерия @  16.4.2007,  23:34 Найти цитируемый пост)
Тоесть полностью высвободить место которое занимают эти объекты. 

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

Это сообщение отредактировал(а) zkv - 16.4.2007, 23:40
PM MAIL   Вверх
Валерия
Дата 16.4.2007, 23:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



А можете переделать мой пример, что бы память под value выделялась динамически, а потом высвобождалась?
Тоесть что бы вообще не было утечки smile
PM MAIL   Вверх
archimed7592
Дата 16.4.2007, 23:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


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

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



Код
void main()
{
    clrscr();
    my obj3;
    {
    my obj1, obj2;
    obj1.value = 5;
    obj2.value = 10;
    obj1.inc();
    obj2.dec();
    obj3.value=obj1.value+obj2.value;
    } // здесь obj1 и obj2 "удалятся" (деструкция + освобождение стека от этих переменных)
    obj3.inc();
    obj3.print();
    getch();
}


Добавлено через 1 минуту и 24 секунды
Цитата(Валерия @  16.4.2007,  23:46 Найти цитируемый пост)
А можете переделать мой пример, что бы память под value выделялась динамически, а потом высвобождалась?
Тоесть что бы вообще не было утечки smile 
какой утечки? тебе же сказали, твои объекты имеют атоматическое время жизни... как только main закончится (в твоём примере), все 3 объекта удалятся


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


Бывалый
*


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

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



Цитата(zkv @  16.4.2007,  23:38 Найти цитируемый пост)

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

 smile 
--------------------
101100010100001101100001110100101111011легкие деньги
PM WWW ICQ   Вверх
Xenon
Дата 17.4.2007, 00:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



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


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


bytegrinder
**


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

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



Цитата
[code=cpp]
void main()
{
    clrscr();
    my obj3;
    {
    my obj1, obj2;
    obj1.value = 5;
    obj2.value = 10;
    obj1.inc();
    obj2.dec();
    obj3.value=obj1.value+obj2.value;
    } // здесь obj1 и obj2 "удалятся" (деструкция + освобождение стека от этих переменных)
    obj3.inc();
    obj3.print();
    getch();
}

Извинните, а почему в этом месте деструктор вызывается. Возможно я что-то подзабыл?

Это сообщение отредактировал(а) Annihilator - 17.4.2007, 07:53


--------------------
Если вы не можете сделать хоpошyю пpогpаммy, сделайте, чтобы она по кpайней меpе выглядела хоpошо
PM ICQ   Вверх
Xenon
Дата 17.4.2007, 08:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Annihilator, заканчивается блок в которым они были объявлены.


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


Шустрый
*


Профиль
Группа: Участник
Сообщений: 147
Регистрация: 10.12.2006
Где: минск, столица на шей Родины

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



делай так
Код
void main()
{
    clrscr();

    my obj1, obj2, obj3;
    obj1.value = 5;
    obj2.value = 10;
    obj1.inc();
    obj2.dec();
    obj3.value=obj1.value+obj2.value;
    delete &obj1; //!!     
    delete &obj2; //!!  
    obj3.inc();
    obj3.print();

    getch();

}


я такое делал когда выделял переменную по такому типу
Код
int& obj=*(new int);//это дает возможность обращаться к переменной не через указалель а через ссылку 
int a;
a=obj;
delete &obj;

в твоем случае это тоже сработает, можешь добавить в деструктор вывод какойнить строки и сам увидишь его запуск

Это сообщение отредактировал(а) fantast - 17.4.2007, 13:31
--------------------
Эпитафия: Он старался.                                   Неизвестный
PM MAIL   Вверх
ama_kid
Дата 17.4.2007, 13:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


АСУТП-кодер
***


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

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



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

Как уже сказали, в данном примере и так не будет утечки... Но если есть необходимость просто понять суть - тогда вот переделанный пример:
Код
#include <stdafx.h>
#include <conio.h>
#include <stdio.h>
#include <stdlib.h>

using namespace std;

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

my::my()
{
   value  = 0;
}

my::~my()
{
    cout<<endl<<"deleted"<<endl;
}

void my::print()
{
    cout << value << "\n";
}

void my::inc()
{
    value++;
}

void my::dec()
{
    value--;
}

int _tmain()
{

    my *obj1 = new my, *obj2= new my, *obj3= new my;
    obj1->value = 5;
    obj2->value = 10;
    obj1->inc();
    obj2->dec();
    obj3->value=obj1->value+obj2->value;
    obj3->inc();
    obj3->print();
    delete obj1;
    delete obj2;
    delete obj3;
 getch();
 return 1;
}

Вызов деструктора у тебя будет виден благодаря надписи "deleted"


--------------------
самурай без меча подобен самураю с мечом, но только без меча 
PM MAIL   Вверх
archimed7592
Дата 17.4.2007, 13:47 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


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

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



Цитата(Annihilator @  17.4.2007,  07:45 Найти цитируемый пост)
Извинните, а почему в этом месте деструктор вызывается. Возможно я что-то подзабыл?
поток исполнения покидает область видимости для этих объектов... т. к. объекты локальные и имеют automatic storage duration (IS-3.7.2), то для них срабатывают деструкторы в порядке, обратном их конструкции.

Цитата(fantast @  17.4.2007,  13:02 Найти цитируемый пост)
делай так
НЕ ДЕЛАЙ ТАК!
указатель, переданный delete должен быть получен с помощью new, иначе будут утечки(прога будет валиться и т.д. и т.п.)


Валерия, если очень хочется явно вызвать деструктор, то можно написать obj1.~my (), но учти, что когда время жизни объекта закончится, деструктор вызовется ещё раз(!) и если в деструкторе освобождается память, то она будет освобождена дважды(!), что опять же утечки и т. п.


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


Шустрый
*


Профиль
Группа: Участник
Сообщений: 147
Регистрация: 10.12.2006
Где: минск, столица на шей Родины

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



Цитата
НЕ ДЕЛАЙ ТАК!


ты уверен? 8)
--------------------
Эпитафия: Он старался.                                   Неизвестный
PM MAIL   Вверх
HappyLife
Дата 17.4.2007, 14:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



archimed7592, 
какие я же могут быть утечки, если, удаление вызовется два раза?
PM MAIL   Вверх
_stranger_
Дата 17.4.2007, 14:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата

   какие я же могут быть утечки, если, удаление вызовется два раза? 

 даже не утечки а UB. 
PM MAIL   Вверх
dumb
Дата 17.4.2007, 14:52 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


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

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



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

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


совет fantast'а из разряда "как сделать поведение программы непредсказуемым"(ub). если оно и не валится, то это только за счет внутренних проверок в delete.
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
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.0585 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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