Консультация № 142034
23.08.2008, 07:39
0.00 руб.
0 3 1
если для какой то переменной была динамически выделена память либо с помощью new,либо с помощью malloc,либо с помощью realloc и т.п.
то может ли что-то страшное произойти, если попытаться освободить её более одного раза.
т.е. 2 раза free или delete

Обсуждение

давно
Старший Модератор
17042
808
23.08.2008, 09:51
общий
Если вызвать delete с недействительным указателем, то есть с тем, для которого не выделена память (в том числе тогда, когда память была ранее освобождена предыдущим вызовом delete), то в системе распределения памяти происходит сбой, что проявляется крахом приложения.
Подобная ошибка хода выполнения (run-time error) довольно часто встречается в программах на C++, если предыдущее освобождение памяти было скрыто где-то в недрах программы. Например, при использовании библиотеки Qt 3.x код ниже

Код:
 
TFindForm* pFindDialog = new TFindForm(this);
pFindDialog->show();
delete pFindDialog;


будет работать нормально, если в параметрах конструктора диалогового окна флаг WFlags установить как 0. Однако если его установить как Qt::WDestructiveClose (уничтожать диалоговое окно при его закрытии), то при выполнении вышеприведённого участка кода программа рухнет, т.к. оператор delete попытается уничтожить уже несуществующее окно.
Поэтому при использовании new - delete при вызове последнего рекомендуется использовать проверку на наличие объекта:

Код:
 
if(pFindDialog) delete pFindDialog;
Об авторе:
We have but faith: we cannot know;
For knowledge is of things we see;
And yet we trust it comes from thee,
A beam in darkness: let it grow.
-----
https://www.linkedin.com/in/andreynkuznetsov
https://www.researchgate.net/profile/Andrey_Kuznetsov11
http://www.researcherid.com/rid/K-8824-2014
давно
Старший Модератор
17042
808
23.08.2008, 09:53
общий
это ответ
Здравствуйте, Warobushek!
Если вызвать delete с недействительным указателем, то есть с тем, для которого не выделена память (в том числе тогда, когда память была ранее освобождена предыдущим вызовом delete), то в системе распределения памяти происходит сбой, что проявляется крахом приложения.
Подобная ошибка хода выполнения (run-time error) довольно часто встречается в программах на C++, если предыдущее освобождение памяти было скрыто где-то в недрах программы. Например, при использовании библиотеки Qt 3.x код ниже

Код:
 
TFindForm* pFindDialog = new TFindForm(this);
pFindDialog->show();
delete pFindDialog;


будет работать нормально, если в параметрах конструктора диалогового окна флаг WFlags установить как 0. Однако если его установить как Qt::WDestructiveClose (уничтожать диалоговое окно при его закрытии), то при выполнении вышеприведённого участка кода программа рухнет, т.к. оператор delete попытается уничтожить уже несуществующее окно.
Поэтому при использовании new - delete при вызове последнего рекомендуется использовать проверку на наличие объекта:

Код:
 
if(pFindDialog) delete pFindDialog;
Об авторе:
We have but faith: we cannot know;
For knowledge is of things we see;
And yet we trust it comes from thee,
A beam in darkness: let it grow.
-----
https://www.linkedin.com/in/andreynkuznetsov
https://www.researchgate.net/profile/Andrey_Kuznetsov11
http://www.researcherid.com/rid/K-8824-2014
Неизвестный
23.08.2008, 11:30
общий
Да может. Поэтому после освобождении памяти
указателю на освобоженную область присваиваем NULL,
а при следующем освобождении проверяем этот указатель на NULL.
Как и говорил предыдущий эксперт.
Удачи!
Форма ответа