![]() |
Модераторы: bsa |
![]() ![]() ![]() |
|
alex7851 |
|
||||||
Новичок Профиль Группа: Участник Сообщений: 10 Регистрация: 5.2.2012 Репутация: нет Всего: нет |
Всем привет. Допустим, вот такой класс:
И такой код:
Скажите, верно ли я понимаю: Объект obj1 будет создан в стеке; он состоит из членов int и int*, которые будут созданы в стеке. Также, в куче будет создан еще объект типа int. Объект obj2 будет создан в куче; то есть его члены a и b будут тоже в куче. При этом тоже еще где-то в куче будет создан еще один int. И скажите еще вот что. Вот такой код:
Ни вызов free, ни ручной вызов деструктора для a не освобождают память, выделенную под FP. Почему? |
||||||
|
|||||||
disputant |
|
||||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 210 Регистрация: 28.11.2011 Репутация: нет Всего: 3 |
Ну, если оператор new не переопределен, то, как мне кажется, все так.
Вообще-то, это вы поступаете не то чтоб категорически незаконно, но очень чревато неприятностями - самостоятельно освобождая или вручную вызывая деструктор... Но в коде я не вижу проверки освобождения - как вы убедились, что освобождение памяти не прошло? И еще - путать в одном коде new и malloc - не комильфо ![]() Это сообщение отредактировал(а) disputant - 28.4.2012, 20:55 |
||||
|
|||||
alex7851 |
|
||||||
Новичок Профиль Группа: Участник Сообщений: 10 Регистрация: 5.2.2012 Репутация: нет Всего: нет |
Я смотрю ProcessExplorer'ом, сколько памяти уходит на процесс. Дело в том, что если написать так:
то отчетливо видно, как память выделилась, потом освободилась, а в том варианте она не освобождается после вызова деструктора. Вообще, тут ситуация такая - сам объект класса лежит в стеке, и содержит член, указывающий на большой кусок в куче. При создании объекта, конструктор выделяет память. Дальше наступает момент, когда объект более не нужен. Как вызвать деструктор и его уничтожить? Ведь, например, delete должен работать в связке с new, то есть высвобождать память, выделенную new и вызывать деструктор. У меня в стеке сам объект, нельзя его удалить. Вопрос чисто академический, чтобы разобраться, я уже по другому реализовал.
Ну, у меня код посложнее, это я его на коленке упростил, чтобы местный народ не читал, что к вопросу отношения не имеет. |
||||||
|
|||||||
ller |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 325 Регистрация: 4.8.2008 Где: г. Таганрог Репутация: 2 Всего: 4 |
Это черевато, в деструкторе будет попытка освободить уже освобожденую память. И потом вызов free не гарантирует возврат памяти системе, она можео остаться зарезервированной за процессом, на случай если еше понадобится. По моему так |
|||
|
||||
feodorv |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 12 Всего: 45 |
А в какой момент вызывается деструктор? А вызывается он уже после getch() ![]() Ну и про malloc/free вместо new/delete и про двойное высвобождение памяти Вам уже написали)))) Это сообщение отредактировал(а) feodorv - 29.4.2012, 01:58 -------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
|||
|
||||
disputant |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 210 Регистрация: 28.11.2011 Репутация: нет Всего: 3 |
Во-первых, при освобождении память не обязательно сразу возвращается системе, так что это способ проверки, мягко говоря, ненадежный.
Во-вторых, деструктор объекта вызывается при выходе из области видимости, так что в своем коде вы вызов деструктора не видите вообще. Для этого лучше было бы так:
Впрочем, черасчур умный оптимизатор может и тут все испортить (хотя если умный, то как раз не должен ![]() |
|||
|
||||
alex7851 |
|
||||
Новичок Профиль Группа: Участник Сообщений: 10 Регистрация: 5.2.2012 Репутация: нет Всего: нет |
Спасибо за ответы.
Не, я имел в виду, если вот эту строчку - free( a.FP ); заменить на a.~GP(); то не видно освобождения. Если вызывать деструктор выходом из области видимости, та же фигня.
Ясно, а надежней можно как-нибудь? |
||||
|
|||||
disputant |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 210 Регистрация: 28.11.2011 Репутация: нет Всего: 3 |
Что-то типа функций heapwalk, heapchk в вашем компиляторе нет? |
|||
|
||||
![]() ![]() ![]() |
Правила форума "C/C++: Для новичков" | |
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |