2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему На страницу 1, 2, 3  След.
 
 весьма странный результат
Сообщение07.02.2009, 18:05 


23/12/08
245
Украина
в книгах о С++ написано что такая ситуацыя приводит к утечке памяти но вот что меня смущает
Код1:
Код:
    int * p = new int;
    *p=10;
    if(1)
    int *p = new int;
    *p =20;
    delete p;   
    cout<<*p;


Код2:
Код:
   double * p = new double;
    *p=10;
    if(1)
    double *p = new double;
    *p =20;
    delete p;
    cout<<*p;


в Dev-C++
в 1 варианте ввыводит "0",
а во втором "20".

Чтобы это могло значить?

 Профиль  
                  
 
 
Сообщение07.02.2009, 18:35 


24/01/09
18
После того как объект по указателю удален, в участке памяти, на которую указывает указатель может быть что угодно.

 Профиль  
                  
 
 
Сообщение07.02.2009, 18:46 
Заслуженный участник


15/05/05
3445
USA
В Visual Studio 2005 в обоих случаях выводится мусор после деструктора.

 Профиль  
                  
 
 
Сообщение07.02.2009, 20:03 


23/12/08
245
Украина
наверно это баг в Dev потомушто выводит именно это сколькобы раз я не перекомпилировал и не пересоздавал проект.

 Профиль  
                  
 
 
Сообщение08.02.2009, 01:47 


19/11/08
347
Чего тут странного?
double по размеру больше int.
Т.е. ссылка на него находится глубже в стэке.
А для оператора delete (или cout<<) тебуется использовать стек на определённую глубину - эта глубина больше размера int но меньше размера double.
При этом число 20 в double хранится в крайнем левом байте (т.к. в памяти они хранятся в перевёрнутом виде) т.е. в самом глубоком.
Поэтому когда оператор delete (или cout<<) "портит" память он достаёт до числа 20 в int (и обнуляет его) но не достаёт до числа 20 в double, а обнуляет и без того его нулевые байты.

Вот и всё.

 Профиль  
                  
 
 
Сообщение08.02.2009, 15:37 


23/12/08
245
Украина
Хм, прикольно :)
И почему об в книжках о С++ не пишут.

Добавлено спустя 1 час 37 минут 21 секунду:

кстати возникает вопрос, а чем тогда заменить "delete" ?

 Профиль  
                  
 
 
Сообщение09.02.2009, 01:13 


19/11/08
347
О чём не пишут?
Об особенностях работы компиляторов?
Так это к C++ не имеет отношения, в другом компиляторе может быть всё по другому.
Этот вопрос ближе к ассемблеру и архитектуре компьютера.

И зачем чем-то заменять delete?

 Профиль  
                  
 
 
Сообщение10.02.2009, 13:26 


21/03/06
1545
Москва
Цитата:
И зачем чем-то заменять delete?

В частности, из-за разобранной выше проблемы. А в качестве альтернативы - концепция "умных указателей", в авторстве Джеффа Элджера, например.

Update:исправлена опечатка "казателей" на "указателей"

 Профиль  
                  
 
 
Сообщение10.02.2009, 13:57 


12/09/08

2262
e2e4 в сообщении #185330 писал(а):
В частности, из-за разобранной выше проблемы.
Разобранное выше — это не проблема, а просто неверный код. В обязанности компилятора не входит забота о содержимом удаленных объектов.
e2e4 в сообщении #185330 писал(а):
А в качестве альтернативы - концепция "умных казателей", в авторстве Джеффа Элджера, например.
Каждому глупому программеру по «умному казателю» :lol:

 Профиль  
                  
 
 
Сообщение10.02.2009, 16:19 


21/03/06
1545
Москва
Цитата:
Разобранное выше — это не проблема, а просто неверный код. В обязанности компилятора не входит забота о содержимом удаленных объектов.

Дык никто и не спорит, что в обязанности компилятора не входит. А проблема все-таки есть, другое дело, кто ее рашеает - компилятор, программист, или частично берет на себя некоторая конструкция в рамках языка без средств отслеживания проблем с памятью.

 Профиль  
                  
 
 
Сообщение10.02.2009, 19:40 


12/09/08

2262
e2e4 в сообщении #185397 писал(а):
А проблема все-таки есть, другое дело, кто ее рашеает - компилятор, программист, или частично берет на себя некоторая конструкция в рамках языка без средств отслеживания проблем с памятью.
Какая проблема? Я не вижу никакой проблемы. Есть намеренная и успешная попытка выстрелить себе в ногу. От такого не спасут никакие механизмы, возможность останется всегда.

 Профиль  
                  
 
 
Сообщение11.02.2009, 09:44 


21/03/06
1545
Москва
Цитата:
Какая проблема? Я не вижу никакой проблемы.

Не видите - дело Ваше.

 Профиль  
                  
 
 
Сообщение11.02.2009, 19:28 
Заслуженный участник


15/05/05
3445
USA
вздымщик Цыпа писал(а):
Какая проблема? Я не вижу никакой проблемы. Есть намеренная и успешная попытка выстрелить себе в ногу. От такого не спасут никакие механизмы, возможность останется всегда.
На самом деле получается выстрел в ноги покупателей программы. А расплачиваться за это будет владелец софтверной фирмы. И если владелец умный, то он будет искать более интеллектуальный компилятор. Или язык программирования без указателей.

 Профиль  
                  
 
 
Сообщение11.02.2009, 23:40 


12/09/08

2262
Yuri Gendelman в сообщении #185662 писал(а):
И если владелец умный, то он будет искать более интеллектуальный компилятор.
Если владелец умный, то он будет искать вменяемых программеров, которые по ногам не стреляют.
Yuri Gendelman в сообщении #185662 писал(а):
Или язык программирования без указателей.
Без указателей это не язык, а невнятное бормотание.

 Профиль  
                  
 
 
Сообщение12.02.2009, 02:26 


19/11/08
347
Я думаю, что из попытки избавиться от указателей и возникла технология COM и далее визуал языки.
Т.е. COM-обьекты ,наверное, задумывались как обьекты которые сами подсчитывают количество ссылок на себя и ,когда их количество становится равным нулю, самоуничтожаются.
Для замены ссылок пришлось придумывать "интерфейсы" ... ну и пошло поехало.
В результате микрософт сделало Visual Basic - язык без указателей (практически).

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 32 ]  На страницу 1, 2, 3  След.

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group