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

Оператор delete - C++

Восстановить пароль Регистрация
 
BigLow
55 / 55 / 2
Регистрация: 07.07.2013
Сообщений: 345
25.08.2013, 13:55     Оператор delete #1
Написал небольшую программу и в просмотрел каждую строчку в отладчике. И получается что сразу же после оператора
C++
1
delete p_val;
значение в памяти меняется с 500.0000000000000 на -2.6569842580370804e+303. Тут у меня сразу возникло несколько вопросов
1. Кто изменяет это значение?
2. Зачем его вообще менять? Пусть остается старое, ведь это лишняя работа


C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
int main()
{
    double      *p_value = NULL;
 
    p_value = new double;
 
    *p_value = 500.0;
 
    std::cout << "*p_value = " << *p_value << std::endl;
 
    delete p_value;
    p_value = NULL;
 
 
 
    system("pause");
    return 0;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.08.2013, 13:55     Оператор delete
Посмотрите здесь:

C++ Оператор delete[]
оператор delete[] C++
Можно ли обобщить оператор delete ? C++
Оператор delete C++
Оператор delete[] C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
GetVariable
 Аватар для GetVariable
163 / 119 / 5
Регистрация: 17.03.2013
Сообщений: 283
25.08.2013, 13:58     Оператор delete #2
Вы же попросили освободить память, вот он и освободил
BigLow
55 / 55 / 2
Регистрация: 07.07.2013
Сообщений: 345
25.08.2013, 14:01  [ТС]     Оператор delete #3
Цитата Сообщение от GetVariable Посмотреть сообщение
Вы же попросили освободить память, вот он и освободил
но я не просил изменять значение, которое записано по тому адресу
GetVariable
 Аватар для GetVariable
163 / 119 / 5
Регистрация: 17.03.2013
Сообщений: 283
25.08.2013, 14:02     Оператор delete #4
переформулирую. вы попросили удалить память.

инчае была бы утечка памяти.
BigLow
55 / 55 / 2
Регистрация: 07.07.2013
Сообщений: 345
25.08.2013, 14:06  [ТС]     Оператор delete #5
Цитата Сообщение от GetVariable Посмотреть сообщение
инчае была бы утечка памяти.
то есть, если я запишу по тому адресу значение -2.6569842580370804e+303, то эта память окажется свободной?
GetVariable
 Аватар для GetVariable
163 / 119 / 5
Регистрация: 17.03.2013
Сообщений: 283
25.08.2013, 14:06     Оператор delete #6
на месте освобождённой памяти лежит мусор, а это его интерпретация.
BigLow
55 / 55 / 2
Регистрация: 07.07.2013
Сообщений: 345
25.08.2013, 14:14  [ТС]     Оператор delete #7
А как вообще программа определяет занята память или свободна?
Я вот что знаю, это когда динамически выделяешь память, то памяти выделяется немного больше.
Если память выделяется для массива, то в этой области записывается его размер.

Т.е. как программа узнает занята память или нет?. Ведь там может быть записано все что угодно

И само слово мусор тоже может означать все что угодно. число 5 - это тоже можно назвать мусором
zer0mail
2185 / 1868 / 187
Регистрация: 03.07.2012
Сообщений: 6,640
Записей в блоге: 1
25.08.2013, 14:17     Оператор delete #8
Возможно, отладчик забивает непроинициализированную память специальным кодом, дабы отлавливать ситуации, когда идет чтение мусора.
BigLow
55 / 55 / 2
Регистрация: 07.07.2013
Сообщений: 345
25.08.2013, 14:21  [ТС]     Оператор delete #9
Цитата Сообщение от zer0mail Посмотреть сообщение
Возможно, отладчик забивает непроинициализированную память специальным кодом
не знаете точно, какими значениями он забивает?

или может кто ссылку даст, чтоб почитать про это
Nekto
342 / 287 / 10
Регистрация: 23.03.2012
Сообщений: 838
25.08.2013, 14:33     Оператор delete #10
Цитата Сообщение от BigLow Посмотреть сообщение
не знаете точно, какими значениями он забивает?
В VS при дебаге вроде 0хСС заполняет.
zer0mail
2185 / 1868 / 187
Регистрация: 03.07.2012
Сообщений: 6,640
Записей в блоге: 1
25.08.2013, 14:35     Оператор delete #11
Я набрал такой код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
int main()
{
    unsigned int     *p1,*p2,*p3;
 
    p1 = new unsigned;
    p2 = new unsigned;
    p3 = new unsigned;
 
    *p1 = 1000;
    *p2 = 2000;
    *p3 = 3000;
 
    delete p3;
    delete p2;
    delete p1;
     return 0;
}
и смотрю отладчиком VS контрольное значение p1,100.

Видно, как происходит выделение памяти для p2,p3, очистка и какими значениями они заполняется Для выделения одного слова диспетчер памяти использует 16 слов... Неинициализированное значение забито байтами 0xcd.
VLK
 Аватар для VLK
192 / 161 / 12
Регистрация: 05.05.2013
Сообщений: 1,221
25.08.2013, 14:38     Оператор delete #12
BigLow, я не знаю как точно, но наверное работает примерно так, есть какой то реестр в котором ведется учет занятых адресов, т.е. тех адресов, на которые нельзя ссылаться, т.к. они уже заняты, при выделении памяти, адрес заносится в этот реестр, при использовании оператора delete адрес из этого реестра удаляется.
BigLow
55 / 55 / 2
Регистрация: 07.07.2013
Сообщений: 345
25.08.2013, 14:40  [ТС]     Оператор delete #13
Цитата Сообщение от Nekto Посмотреть сообщение
В VS при дебаге вроде 0хСС заполняет.
Цитата Сообщение от zer0mail Посмотреть сообщение
Неинициализированное значение забито байтами 0xcd.
а у меня все неинициализированные показывают 0xcccccccc

я сразу не догадался так же сделать, а инициализировал указатель NULL

теперь все понятно
zer0mail
2185 / 1868 / 187
Регистрация: 03.07.2012
Сообщений: 6,640
Записей в блоге: 1
25.08.2013, 14:49     Оператор delete #14
delete передает адрес удаляемого объекта, а информация о выделенном куске памяти расположена перед этим адресом и система ее считывает. Если в моем примере выше читать данные p1[1]-p1[15], то получите служебную информацию по области памяти, выделенной для p2. А если туда что-нибудь запишите, то можете испортить работу программы Можно взять адрес p1-20 и посмотреть информацию для p1 .
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.08.2013, 16:51     Оператор delete
Еще ссылки по теме:

C++ оператор delete
Оператор delete в деструкторе C++
C++ Нужно ли тут вызывать оператор delete

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

Или воспользуйтесь поиском по форуму:
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
25.08.2013, 16:51     Оператор delete #15
Цитата Сообщение от BigLow Посмотреть сообщение
или может кто ссылку даст, чтоб почитать про это
Можно погуглить на тему guard bytes ...
Yandex
Объявления
25.08.2013, 16:51     Оператор delete
Ответ Создать тему
Опции темы

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