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

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

Восстановить пароль Регистрация
 
AnreyKazakov
Заблокирован
16.10.2012, 23:53     Повторное применение оператора delete #1
Это нормально так делать? в одном учебнике нашел:
Вы можете попасть в ситуацию, когда delete вызывается неоднократно для одного и того же объекта ............ Чтобы избежать повторного применения delete к указателю, возмите за правило обнулять указатель после уничтожения объекта:
C++
1
2
3
4
Monster* Borg=new Monster;
delete Borg;
Borg=0;
//Теперь повторный вызов delete безопасен
Вопросик, память при этом не потеряется, если второй раз delete не будет вызван?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ValeryS
Модератор
6374 / 4840 / 441
Регистрация: 14.02.2011
Сообщений: 16,040
16.10.2012, 23:55     Повторное применение оператора delete #2
Цитата Сообщение от AnreyKazakov Посмотреть сообщение
Вопросик, память при этом не потеряется, если второй раз delete не будет вызван?
нет
delete 0 ничего не сделает ни хорошего не плохого
обнуление указателя это и есть защита от краха программы при повторном вызове delete
panicwassano
590 / 558 / 20
Регистрация: 07.11.2010
Сообщений: 2,004
16.10.2012, 23:55     Повторное применение оператора delete #3
Цитата Сообщение от AnreyKazakov Посмотреть сообщение
Вопросик, память при этом не потеряется, если второй раз delete не будет вызван?
ну вы пробовали 2 раза сделать delete к указателю? обязательно попробуйте, увидите как к вам будет "ДОБР" компилятор
ValeryS
Модератор
6374 / 4840 / 441
Регистрация: 14.02.2011
Сообщений: 16,040
16.10.2012, 23:57     Повторное применение оператора delete #4
Цитата Сообщение от panicwassano Посмотреть сообщение
обязательно попробуйте, увидите как к вам будет "ДОБР" компилятор
компилятор это спокойно пропустит, а при выполнении....
AnreyKazakov
Заблокирован
17.10.2012, 00:03  [ТС]     Повторное применение оператора delete #5
Цитата Сообщение от panicwassano Посмотреть сообщение
обязательно попробуйте, увидите как к вам будет "ДОБР" компилятор
Недели две назад как раз здесь выкладывал, два раза дэл, компиль пропустил, и потом ошибки не было, но у меня, как я понял потом АрхиЧастный случай. А вот с этим примером не понятно было, ну чтож приму как факт, хотя странно конечно, вроде уже удалили объект к чертям, а потом опять чем-то инициализируем. Одни загадки в этом бренном мире.....
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11811 / 6790 / 767
Регистрация: 27.09.2012
Сообщений: 16,840
Записей в блоге: 2
Завершенные тесты: 1
17.10.2012, 00:08     Повторное применение оператора delete #6
Цитата Сообщение от AnreyKazakov Посмотреть сообщение
вроде уже удалили объект к чертям, а потом опять чем-то инициализируем. Одни загадки в этом бренном мире.....
Вы удалили объект, а указатель на него еще указывает, поэтому данный указатель нужно обнулить.
AnreyKazakov
Заблокирован
17.10.2012, 00:11  [ТС]     Повторное применение оператора delete #7
Croessmah, теперь понял
ValeryS
Модератор
6374 / 4840 / 441
Регистрация: 14.02.2011
Сообщений: 16,040
17.10.2012, 00:14     Повторное применение оператора delete #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 ничего не сделает
AnreyKazakov
Заблокирован
17.10.2012, 00:34  [ТС]     Повторное применение оператора delete #9
Цитата Сообщение от ValeryS Посмотреть сообщение
A(){ptrA=0;}
Эта строчка равна вот этой ?
C++
1
A():ptrA(0){}
Путаюсь пока еще....
Kgfq
74 / 37 / 2
Регистрация: 23.09.2012
Сообщений: 408
17.10.2012, 00:41     Повторное применение оператора delete #10

Не по теме:

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



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

Добавлено через 31 секунду
Цитата Сообщение от AnreyKazakov Посмотреть сообщение
Эта строчка равна вот этой ?
равна
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11811 / 6790 / 767
Регистрация: 27.09.2012
Сообщений: 16,840
Записей в блоге: 2
Завершенные тесты: 1
17.10.2012, 00:46     Повторное применение оператора delete #11

Не по теме:

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



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

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

Не по теме:

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

Croessmah
17.10.2012, 02:03
  #15

Не по теме:

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

ValeryS
Модератор
6374 / 4840 / 441
Регистрация: 14.02.2011
Сообщений: 16,040
17.10.2012, 06:26     Повторное применение оператора delete #16
Цитата Сообщение от AnreyKazakov Посмотреть сообщение
Пока сидел загадку придумал компилятору
C++
1
2
3
inline enternity(x){
if(x) enternity(x-1);
}
какая ж это загадка, отбросит inline да и все
inline это рекомендация компилятору а не команда
Croessmah
17.10.2012, 06:27
  #17

Не по теме:

Цитата Сообщение от ValeryS Посмотреть сообщение
какая ж это загадка, отбросит inline да и все
inline это рекомендация компилятору а не команда
Загадка в том, что смотрит он и думает:
а зачем в программе пустая функция?

ValeryS
Модератор
6374 / 4840 / 441
Регистрация: 14.02.2011
Сообщений: 16,040
17.10.2012, 06:34     Повторное применение оператора delete #18
кстати передай своей функции -1и получишь бесконечную(почти что) рекурсию
стек вылетит раньше чем до нуля дойдет

Добавлено через 1 минуту

Не по теме:

Цитата Сообщение от Croessmah Посмотреть сообщение
а зачем в программе пустая функция?
а может для того чтобы стек сломать
типа такая защита

MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.10.2012, 06:36     Повторное применение оператора delete
Еще ссылки по теме:

Назначение оператора delete[] C++
Применение тернарного оператора. Необходимо определить месяц C++
Придумайте простую программу с использованием условного оператора IF и оператора switch C++

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

Или воспользуйтесь поиском по форуму:
Croessmah
17.10.2012, 06:36     Повторное применение оператора delete
  #19

Не по теме:

Цитата Сообщение от ValeryS Посмотреть сообщение
а может для того чтобы стек сломать
типа такая защита
А довольно интересный способ защитить программу - сломать её =)))

Yandex
Объявления
17.10.2012, 06:36     Повторное применение оператора delete
Ответ Создать тему
Опции темы

Текущее время: 05:47. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru