Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.57/7: Рейтинг темы: голосов - 7, средняя оценка - 4.57
243 / 182 / 73
Регистрация: 18.07.2017
Сообщений: 893
1

Освобождение памяти в деструкторе

04.08.2017, 17:28. Показов 1400. Ответов 6
Метки нет (Все метки)

Объясните, пожалуйста, что я делаю не правильно.
Есть класс:

C++
1
2
3
4
5
6
class a{
    int * ptr;
public:
    a(){ptr=new int[20];}
    ~a(){delete [] ptr;}
};
И вызов деструктора вызывает ошибку:

C++
1
2
3
4
5
6
7
8
9
int main()
{
    a b;
    b.~a();
 
    // Так все работает
    //a* b=new a;
    //b->~a();
}
0
Миниатюры
Освобождение памяти в деструкторе  
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
04.08.2017, 17:28
Ответы с готовыми решениями:

Освобождение памяти в деструкторе
Здравствуйте у меня есть три класса: class Date { int iDay, iMonth, iYear; public: Date();...

Освобождение памяти в деструкторе класса
Перечитал по этому поводу много информации. Главный вопрос. Есть класс в котором происходит...

Выделение и освобождение памяти в конструкторе и деструкторе
Есть программа с классом содержащим обьекты векторы. Однако по кончанию программы выбивате ошибку...

Резервирование памяти/освобождение памяти для трехмерного массива
Необходимо создать трехмерный массив (A), в котором элементы вдоль направления Z выли бы выровнены...

6
Любитель чаепитий
3586 / 1686 / 519
Регистрация: 24.08.2014
Сообщений: 5,704
Записей в блоге: 1
04.08.2017, 17:32 2
Лучший ответ Сообщение было отмечено assemberist как решение

Решение

двойной вызов дестркутора.
уберите ручной вызов деструктора и всё заработает.
1
846 / 777 / 258
Регистрация: 27.07.2012
Сообщений: 2,182
04.08.2017, 17:34 3
Лучший ответ Сообщение было отмечено assemberist как решение

Решение

Цитата Сообщение от assemberist Посмотреть сообщение
И вызов деструктора вызывает ошибку
C++
1
2
    a b;
    b.~a(); // не надо так
Здесь его не нужно вызывать, он сам вызовется при выходе объекта из области видимости. Что, собственно, и происходит тут, и имеем повторное освобождение уже освобождённой памяти в деструкторе

C++
1
2
3
    // Так все работает
    a* b=new a;
    b->~a(); // так тоже не надо
Здесь нет ошибки, так как объект не удаляется. Но здесь есть утечка памяти. Для её освобождения надо вызывать delete b;, но тогда опять повториться первая проблема.
0
243 / 182 / 73
Регистрация: 18.07.2017
Сообщений: 893
04.08.2017, 17:41  [ТС] 4
Нашел два решения: первое - создать в классе функцию, освобождающую память

C++
1
2
3
4
5
6
7
class a{
    int * ptr;
public:
    a(){ptr=new int[20];}
    void free_memory(){delete [] ptr;}
    ~a(){}
};
Второе:
Кликните здесь для просмотра всего текста
нашел случайно
добавить в деструктор команд.

C++
1
    ~a(){delete [] ptr; cout << '\n';}
Не пойму пойму работает.
0
494 / 208 / 70
Регистрация: 27.05.2016
Сообщений: 554
04.08.2017, 17:47 5
Лучший ответ Сообщение было отмечено assemberist как решение

Решение

assemberist, двойной вызов деструктора, два раза вызывается delete [] ptr. Можно себя обезопасить от этого:
C++
1
~a() {delete [] ptr; ptr = nullptr;}
0
2542 / 1201 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
04.08.2017, 19:13 6
Цитата Сообщение от notAll Посмотреть сообщение
двойной вызов деструктора, два раза вызывается delete [] ptr. Можно себя обезопасить от этого:
ахахахах )))))))))))
2
494 / 208 / 70
Регистрация: 27.05.2016
Сообщений: 554
04.08.2017, 20:25 7
Да, будет UB:
12.4
Once a destructor is invoked for an object, the object no longer exists; the behavior is undefined if the
destructor is invoked for an object whose lifetime has ended (3.8). [ Example: if the destructor for an
automatic object is explicitly invoked, and the block is subsequently left in a manner that would ordinarily
invoke implicit destruction of the object, the behavior is undefined. — end example ]
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
04.08.2017, 20:25

Объяснить причины и способы устранения утечки памяти в деструкторе
Почему если убрать коммент с деструктора, что закомментирован выбивает ошибка: &quot;утечка памяти&quot;?...

Освобождение памяти
Похоже что проблема с освобождением памяти. У меня есть абстрактный класс CObject и его потомок...

Освобождение памяти
#include&lt;iostream&gt; #include&lt;cstring&gt; using namespace std; struct stringy{ char * str; int...

Освобождение памяти
Как сделать, чтобы при вызове деструктора экземпляра i класса image, вызвался и деструктор класса...


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

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

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