Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Lordif
21 / 21 / 1
Регистрация: 18.04.2010
Сообщений: 87
#1

Два раза вызывается деструктор - C++

31.05.2012, 21:18. Просмотров 1193. Ответов 5
Метки нет (Все метки)

Создал класс, в процессе выполнения программы вызвал деструктор, но когда программа завершается, деструктор вызывается повторно и вылетает ошибка, так как внутри есть указатели, которые уже удалены или обнулены.
C++
1
2
3
4
int main(){
Class<int> A;
A.~Class(); //Вызывается деструктор
} //Повторно вызывается деструктор
Объясните почему такое может происходить?

Добавлено через 4 минуты
Только что заметил, тоже самое и с std::list
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
31.05.2012, 21:18
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Два раза вызывается деструктор (C++):

Почему деструктор вызывается два раза - C++
Всем привет. Есть код, для примера #include &lt;vector&gt; using namespace std; struct AA { int n; AA() :n(0) { cout &lt;&lt;...

Конструктор вызывается один раз, а деструктор два раза - C++
Программа для обработки исключений. Вообщем если ввести два числа и второе будет 0, то конструктор будет вызван 1 раз, а деструктор 2...

При создании класса конструктор вызывается 2 раза, затем вызывается деструктор о_О - C++
Вот такой кодclass A { public: A(){} virtual ~A(){} }; class C { public:

Не вызывается деструктор - C++
#include &lt;iostream&gt; using namespace std; class myclass { int a; public: myclass(); // конструктор ~myclass(); //...

Не вызывается деструктор - C++
_Здравствуйте. Я новичок в программировании, сейчас изучаю самостоятельно С++ по книге Джесса Либерти. При разборе одного из примеров...

Деструктор не вызывается - C++
В одном классе я создаю объект, и если проверку не проходит, я его возвращаю в другой метод, дабы у меня там начало всех начал,Главное...

5
Nick Alte
Эксперт С++
1642 / 1014 / 119
Регистрация: 27.09.2009
Сообщений: 1,945
Завершенные тесты: 1
31.05.2012, 21:28 #2
Деструкторы не надо вызывать явно. Их вызов генерируется автоматически при уничтожении объекта.
0
Lordif
21 / 21 / 1
Регистрация: 18.04.2010
Сообщений: 87
31.05.2012, 21:31  [ТС] #3
А если мне необходимо уничтожить объект в каком то месте программы?
0
antoha398
155 / 155 / 3
Регистрация: 29.03.2012
Сообщений: 418
31.05.2012, 21:34 #4
Цитата Сообщение от Lordif Посмотреть сообщение
А если мне необходимо уничтожить объект в каком то месте программы?
тогда выделяй под него динамическую память.
1
Nick Alte
Эксперт С++
1642 / 1014 / 119
Регистрация: 27.09.2009
Сообщений: 1,945
Завершенные тесты: 1
31.05.2012, 21:36 #5
Тогда логично устроить так, чтобы в этом месте заканчивался его цикл жизни. Например, вложенным блоком:
C++
1
2
3
4
5
6
7
8
9
10
void foo()
{
    {
        std::vector<int> a;
        a.reserve(100);
        // ...
    }  // Здесь a уничтожается
    std::list<std::string> l;
    // ...
}  // Здесь уничтожается l
Если даже блоками удобно не получается - к нашим услугам всегда "сладкая парочка" new-delete, а лучше new и unique_ptr
0
Lordif
21 / 21 / 1
Регистрация: 18.04.2010
Сообщений: 87
31.05.2012, 21:38  [ТС] #6
Спасибо, что помогли разобраться
0
31.05.2012, 21:38
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
31.05.2012, 21:38
Привет! Вот еще темы с ответами:

Не вызывается деструктор структуры - C++
Создал класс. Членом класса является указатели на структуру, которая определена в классе. Поля структуры указатели, т.к. работа будет с...

Почему вызывается деструктор? - C++
Доброго времени суток. Написал такой код: struct O { virtual ~O() { cout &lt;&lt; &quot;hey&quot;; } }; struct...

Почему не вызывается деструктор? - C++
Всем доброго времени суток! Подскажите пожалуйста - почему не вызывается деструктор при выполнении строки 48? #include&lt;iostream&gt;...

Даден массив. Все четные елементы массива уменьшыть в два раза, а нечетные увеличить в два раза. - C++
С++. Даден массив. Все четные елементы массива уменьшыть в два раза, а нечетные увеличить в два раза. Сложновато :sorry:


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.