2014 dxdy logo

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

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




На страницу 1, 2, 3  След.
 
 весьма странный результат
Сообщение07.02.2009, 18:05 
в книгах о С++ написано что такая ситуацыя приводит к утечке памяти но вот что меня смущает
Код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 
После того как объект по указателю удален, в участке памяти, на которую указывает указатель может быть что угодно.

 
 
 
 
Сообщение07.02.2009, 18:46 
В Visual Studio 2005 в обоих случаях выводится мусор после деструктора.

 
 
 
 
Сообщение07.02.2009, 20:03 
наверно это баг в Dev потомушто выводит именно это сколькобы раз я не перекомпилировал и не пересоздавал проект.

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

Вот и всё.

 
 
 
 
Сообщение08.02.2009, 15:37 
Хм, прикольно :)
И почему об в книжках о С++ не пишут.

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

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

 
 
 
 
Сообщение09.02.2009, 01:13 
О чём не пишут?
Об особенностях работы компиляторов?
Так это к C++ не имеет отношения, в другом компиляторе может быть всё по другому.
Этот вопрос ближе к ассемблеру и архитектуре компьютера.

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

 
 
 
 
Сообщение10.02.2009, 13:26 
Цитата:
И зачем чем-то заменять delete?

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

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

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

 
 
 
 
Сообщение10.02.2009, 16:19 
Цитата:
Разобранное выше — это не проблема, а просто неверный код. В обязанности компилятора не входит забота о содержимом удаленных объектов.

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

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

 
 
 
 
Сообщение11.02.2009, 09:44 
Цитата:
Какая проблема? Я не вижу никакой проблемы.

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

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

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

 
 
 
 
Сообщение12.02.2009, 02:26 
Я думаю, что из попытки избавиться от указателей и возникла технология COM и далее визуал языки.
Т.е. COM-обьекты ,наверное, задумывались как обьекты которые сами подсчитывают количество ссылок на себя и ,когда их количество становится равным нулю, самоуничтожаются.
Для замены ссылок пришлось придумывать "интерфейсы" ... ну и пошло поехало.
В результате микрософт сделало Visual Basic - язык без указателей (практически).

 
 
 [ Сообщений: 32 ]  На страницу 1, 2, 3  След.


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group