Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.78/9: Рейтинг темы: голосов - 9, средняя оценка - 4.78
447 / 323 / 129
Регистрация: 18.07.2017
Сообщений: 1,454
1

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

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

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

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
Любитель чаепитий
3742 / 1798 / 566
Регистрация: 24.08.2014
Сообщений: 6,016
Записей в блоге: 1
04.08.2017, 17:32 2
Лучший ответ Сообщение было отмечено assemberist как решение

Решение

двойной вызов дестркутора.
уберите ручной вызов деструктора и всё заработает.
1
2276 / 1767 / 741
Регистрация: 27.07.2012
Сообщений: 5,250
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
447 / 323 / 129
Регистрация: 18.07.2017
Сообщений: 1,454
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
495 / 209 / 70
Регистрация: 27.05.2016
Сообщений: 557
04.08.2017, 17:47 5
Лучший ответ Сообщение было отмечено assemberist как решение

Решение

assemberist, двойной вызов деструктора, два раза вызывается delete [] ptr. Можно себя обезопасить от этого:
C++
1
~a() {delete [] ptr; ptr = nullptr;}
0
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
04.08.2017, 19:13 6
Цитата Сообщение от notAll Посмотреть сообщение
двойной вызов деструктора, два раза вызывается delete [] ptr. Можно себя обезопасить от этого:
ахахахах )))))))))))
2
495 / 209 / 70
Регистрация: 27.05.2016
Сообщений: 557
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
04.08.2017, 20:25
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
Copyright ©2000 - 2024, CyberForum.ru