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

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

Войти
Регистрация
Восстановить пароль
 
 
AnreyKazakov
Заблокирован
#1

Повторное применение оператора delete - C++

16.10.2012, 23:53. Просмотров 1176. Ответов 18
Метки нет (Все метки)

Это нормально так делать? в одном учебнике нашел:
Вы можете попасть в ситуацию, когда delete вызывается неоднократно для одного и того же объекта ............ Чтобы избежать повторного применения delete к указателю, возмите за правило обнулять указатель после уничтожения объекта:
C++
1
2
3
4
Monster* Borg=new Monster;
delete Borg;
Borg=0;
//Теперь повторный вызов delete безопасен
Вопросик, память при этом не потеряется, если второй раз delete не будет вызван?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.10.2012, 23:53
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Повторное применение оператора delete (C++):

Назначение оператора delete[] - C++
Для освобождения динамической памяти от массива предлагают оператор delete #include <iostream> using namespace std; int main() ...

Перегрузка оператора new и delete - C++
привет! подскажите, каким образом можно перегрузить операторы new и delete? заранее спасибо!

Перегрузка глобального оператора delete с параметрами - C++
Столкнулся с проблемой при перегрузке оператора delete с параметрами: почему-то всегда вызывается не мой оператор, а стандартный. Вот...

Недопустимая операция при выполнении оператора delete[] - C++
Проблема у меня такая. Есть функция. Кусок ее кода выглядит примерно так: //... получам M и N float *pArr1 = new float ; int *pArr2 =...

Применение тернарного оператора. Необходимо определить месяц - C++
Прошу помочь. Я новичок. Не могу разобраться. Задача: По номеру введенным пользователем (от 1 до 12), необходимо вывести на экран...

Ошибка при использовании оператора delete в Visual Studio 2010 - C++
Изучаю указатели в C++. Есть следующий код: #include <iostream> #include <locale> using namespace std; int main() { ...

18
ValeryS
Модератор
6679 / 5088 / 475
Регистрация: 14.02.2011
Сообщений: 17,081
16.10.2012, 23:55 #2
Цитата Сообщение от AnreyKazakov Посмотреть сообщение
Вопросик, память при этом не потеряется, если второй раз delete не будет вызван?
нет
delete 0 ничего не сделает ни хорошего не плохого
обнуление указателя это и есть защита от краха программы при повторном вызове delete
1
panicwassano
592 / 560 / 20
Регистрация: 07.11.2010
Сообщений: 2,004
16.10.2012, 23:55 #3
Цитата Сообщение от AnreyKazakov Посмотреть сообщение
Вопросик, память при этом не потеряется, если второй раз delete не будет вызван?
ну вы пробовали 2 раза сделать delete к указателю? обязательно попробуйте, увидите как к вам будет "ДОБР" компилятор
1
ValeryS
Модератор
6679 / 5088 / 475
Регистрация: 14.02.2011
Сообщений: 17,081
16.10.2012, 23:57 #4
Цитата Сообщение от panicwassano Посмотреть сообщение
обязательно попробуйте, увидите как к вам будет "ДОБР" компилятор
компилятор это спокойно пропустит, а при выполнении....
2
AnreyKazakov
Заблокирован
17.10.2012, 00:03  [ТС] #5
Цитата Сообщение от panicwassano Посмотреть сообщение
обязательно попробуйте, увидите как к вам будет "ДОБР" компилятор
Недели две назад как раз здесь выкладывал, два раза дэл, компиль пропустил, и потом ошибки не было, но у меня, как я понял потом АрхиЧастный случай. А вот с этим примером не понятно было, ну чтож приму как факт, хотя странно конечно, вроде уже удалили объект к чертям, а потом опять чем-то инициализируем. Одни загадки в этом бренном мире.....
0
Croessmah
Эксперт CЭксперт С++
13513 / 7671 / 866
Регистрация: 27.09.2012
Сообщений: 18,882
Записей в блоге: 3
Завершенные тесты: 1
17.10.2012, 00:08 #6
Цитата Сообщение от AnreyKazakov Посмотреть сообщение
вроде уже удалили объект к чертям, а потом опять чем-то инициализируем. Одни загадки в этом бренном мире.....
Вы удалили объект, а указатель на него еще указывает, поэтому данный указатель нужно обнулить.
1
AnreyKazakov
Заблокирован
17.10.2012, 00:11  [ТС] #7
Croessmah, теперь понял
0
ValeryS
Модератор
6679 / 5088 / 475
Регистрация: 14.02.2011
Сообщений: 17,081
17.10.2012, 00:14 #8
Цитата Сообщение от AnreyKazakov Посмотреть сообщение
вроде уже удалили объект к чертям, а потом опять чем-то инициализируем.
не чем то а нулем
приведу пример где это очень хорошо вырисовывается
у тебя есть класс с указателем который указывает на выделенную память которая выделяется при каком то условии деструктор должен эту память освободить
C++
1
2
3
4
5
class A
{
 int *ptrA;
  A(){ptrA=0;}//лучше так, и правильней и понятней ptrA=NULL;
}
в деструкторе ты можешь написать так
C++
1
2
if(ptrA)
  delete ptrA;
а можешь так
C++
1
  delete ptrA;
если память была выделена она освободится, а если указатель нулевой то delete ничего не сделает
1
AnreyKazakov
Заблокирован
17.10.2012, 00:34  [ТС] #9
Цитата Сообщение от ValeryS Посмотреть сообщение
A(){ptrA=0;}
Эта строчка равна вот этой ?
C++
1
A():ptrA(0){}
Путаюсь пока еще....
0
Kgfq
74 / 37 / 2
Регистрация: 23.09.2012
Сообщений: 408
17.10.2012, 00:41 #10

Не по теме:

А если проггать с умом, то таких моментов не возникнет.



Добавлено через 12 секунд
AnreyKazakov, да

Добавлено через 31 секунду
Цитата Сообщение от AnreyKazakov Посмотреть сообщение
Эта строчка равна вот этой ?
равна
1
Croessmah
Эксперт CЭксперт С++
13513 / 7671 / 866
Регистрация: 27.09.2012
Сообщений: 18,882
Записей в блоге: 3
Завершенные тесты: 1
17.10.2012, 00:46 #11

Не по теме:

Не возникнет? В проекте типа "Hello, world" за этим легко следить, а при написании большой программы всего в голове не удержишь.



Цитата Сообщение от AnreyKazakov Посмотреть сообщение
Эта строчка равна вот этой ?
По сути равна, но лучше таким способом инициализировать только константы.
1
AnreyKazakov
Заблокирован
17.10.2012, 01:03  [ТС] #12
Почему только константы?

Пока сидел загадку придумал компилятору
C++
1
2
3
inline enternity(x){
if(x) enternity(x-1);
}
Жалко, что он не все функции инлайнит...
0
Croessmah
Эксперт CЭксперт С++
13513 / 7671 / 866
Регистрация: 27.09.2012
Сообщений: 18,882
Записей в блоге: 3
Завершенные тесты: 1
17.10.2012, 01:14 #13
Цитата Сообщение от AnreyKazakov Посмотреть сообщение
Почему только константы?
В данном примере без разницы, но если в классе будет достаточно много констант и переменных, то тут получится каша =)
1
Jupiter
17.10.2012, 01:58
  #14

Не по теме:

Цитата Сообщение от Croessmah Посмотреть сообщение
то тут получится каша =)
<sarcasm> с молоком? </sarcasm>

1
Croessmah
17.10.2012, 02:03     Повторное применение оператора delete
  #15

Не по теме:

Цитата Сообщение от Jupiter Посмотреть сообщение
<sarcasm> с молоком? </sarcasm>
это от автора зависит. На вкус и цвет =)

0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.10.2012, 02:03
Привет! Вот еще темы с ответами:

Почему при выполнении оператора delete возникает ошибка "program.exe has triggered a breakpoint"? - C++
class test { public: void a() { std::cout &lt;&lt; &quot;test::a&quot; &lt;&lt; std::endl; } }; class test2 : public test { public: ...

В чем разница между delete и delete[]? - C++
а можете еще по подробней рассказать про delete, точнее даже delete, чем именно отличается delete от delete, т.к. я попробовал...

Чем отличается delete[] от delete? - C++
чем отличается? delete mas от delete mas

Избыточное копирование объекта при реализации оператора умножения и оператора присваивания - C++
Есть класс работы с матрицами. Есть операция умножения матриц, описанная как оператор класса. В данном коротком примере я просто моделирую...


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

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

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