Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 02.12.2011, 18:44   #1
_-Re@l-_
C++, Java
Старожил
 
Аватар для _-Re@l-_
 
Регистрация: 10.04.2010
Сообщений: 2,665
По умолчанию Явный вызов деструктора

Ну, вдогонку предыдущей теме Вот весь код:
Код:
#include <iostream>

#pragma warning( disable : 4290 )

class Array
{
public:
    Array(int s) : t(new int[s]) , size(s)
    {
	std::cout << "Array()" << std::endl;
    }
    ~Array()
    {
	std::cout << "~Array()" << std::endl;
	delete[] t;
    }

    int& operator[](int a) throw(std::string)
    {
	if ( a >= 0 && a < size )
	    return t[a];
	else throw "Range Error!";
    }

private:
    int size;
    int* t;
};

inline void release(Array& a)
{
    a.~Array();
}

int main()
{
    Array x(10);

    for ( register int i = 0 ; i < 10 ; i++ )
    {
	x[i] = i*2;
	std::cout << x[i] << " ";
    }
    std::cout << std::endl;
    release(x);

    system("pause");
    return 0;
}
Однако, деструктор вызывается 2(!) раза. С чем это связано? Ведь я же вроде ручками уничтожаю объект.
_-Re@l-_ вне форума Ответить с цитированием
Старый 02.12.2011, 19:03   #2
artush1984
Форумчанин
 
Аватар для artush1984
 
Регистрация: 27.04.2009
Сообщений: 184
По умолчанию

Насколько я знаю ~Array() это функция которая вызывается перед удалением объекта. Получается что один раз вы вызываете функцию ~Array() а другой раз она вызывается компилятором.Мы называем ~Array() деструктором но на самом то деле это не она удаляет объект.
Hа C я могy пpосто делать ошибки, на C++ я могy их наследовать!

Последний раз редактировалось artush1984; 02.12.2011 в 19:08.
artush1984 вне форума Ответить с цитированием
Старый 02.12.2011, 19:10   #3
_-Re@l-_
C++, Java
Старожил
 
Аватар для _-Re@l-_
 
Регистрация: 10.04.2010
Сообщений: 2,665
По умолчанию

Ну, это то я тоже понимаю Но почему такое безобразие?
_-Re@l-_ вне форума Ответить с цитированием
Старый 02.12.2011, 19:35   #4
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

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

Код:
	{
		Array a(1);
	}  // <- вот тут спрятан вызов деструктора для а
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 02.12.2011, 21:26   #5
Сыроежка
Форумчанин
 
Регистрация: 01.07.2011
Сообщений: 423
По умолчанию

Цитата:
Сообщение от _-Re@l-_ Посмотреть сообщение
Ну, вдогонку предыдущей теме Вот весь код:
Код:
#include <iostream>

#pragma warning( disable : 4290 )

class Array
{
public:
    Array(int s) : t(new int[s]) , size(s)
    {
	std::cout << "Array()" << std::endl;
    }
    ~Array()
    {
	std::cout << "~Array()" << std::endl;
	delete[] t;
    }

    int& operator[](int a) throw(std::string)
    {
	if ( a >= 0 && a < size )
	    return t[a];
	else throw "Range Error!";
    }

private:
    int size;
    int* t;
};

inline void release(Array& a)
{
    a.~Array();
}

int main()
{
    Array x(10);

    for ( register int i = 0 ; i < 10 ; i++ )
    {
	x[i] = i*2;
	std::cout << x[i] << " ";
    }
    std::cout << std::endl;
    release(x);

    system("pause");
    return 0;
}
Однако, деструктор вызывается 2(!) раза. С чем это связано? Ведь я же вроде ручками уничтожаю объект.
Когда вы объявляете локальный объект типа класса, компилятор включает в этот же блок вызов деструктора объекта, когда управление передается за пределы блока. Поэтому деструктор вызывается дважды: один раз вы его сами вызвали, и второй раз его вызывает код, который сгенерировал компилятор для уничтожения локальных объектов блока.
Со мной можно встретиться на www.clipper.borda.ru
Сыроежка вне форума Ответить с цитированием
Старый 02.12.2011, 21:28   #6
Blade
Software Engineer
Участник клуба
 
Аватар для Blade
 
Регистрация: 07.04.2007
Сообщений: 1,618
По умолчанию

Зачем вообще такие извращения? Зачем пытаться "явно вызвать деструктор"?
Хотите контролировать время жизни объекта? Создавайте его динамически.
Мужество есть лишь у тех, кто ощутил сердцем страх, кто смотрит в пропасть, но смотрит с гордостью в глазах. (с) Ария
Blade вне форума Ответить с цитированием
Старый 03.12.2011, 11:59   #7
_-Re@l-_
C++, Java
Старожил
 
Аватар для _-Re@l-_
 
Регистрация: 10.04.2010
Сообщений: 2,665
По умолчанию

Цитата:
Зачем вообще такие извращения?
Да я вообще программист-извращенец.
Цитата:
Зачем пытаться "явно вызвать деструктор"?
Хочу
Цитата:
Хотите контролировать время жизни объекта? Создавайте его динамически.
Ну, так-то я и могу.
_-Re@l-_ вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
C++. Описание деструктора под массив. Colder M Помощь студентам 5 12.04.2011 05:07
Переопределение деструктора avd Общие вопросы Delphi 2 31.01.2011 11:16
Corruption of the heap при вызове деструктора pure Общие вопросы C/C++ 1 30.11.2010 21:09
Работа деструктора ignis_divine Помощь студентам 2 12.09.2010 17:43
Использование виртуального деструктора Fataller Общие вопросы C/C++ 3 12.12.2009 22:08