Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > Освобождение памяти указателей void*


Автор: Alexeis 11.7.2008, 10:09
Корректно ли будет освобождена память, если delete передать void*
Например
Код

void* foo = new foostruct;
delete foo;

foostruct - это структура. 
Такая операция допустима в принципе или это чистой воды вредительство?
Знаю, что при таком удалении не вызывается деструктор, это единственная проблема или есть еще подводные камни?

Спасибо.

Автор: Lazin 11.7.2008, 10:12
а это компилируется?
если нужно работать с памятью не типизировано, через указатели на void, то лучше просто использовать malloc/realloc/free...

Автор: Mayk 11.7.2008, 10:28
Цитата(Alexeis @  11.7.2008,  14:09 Найти цитируемый пост)
Знаю, что при таком удалении не вызывается деструктор, это единственная проблема или есть еще подводные камни?

Не вызов деструкторов вполне достаточная причина для отказа от подобной конструкции.
Цитата(Lazin)
    
а это компилируется?

К тому же g++ сыпет предупреждения что deleting 'void*' is undefined. Что тоже страшно.


Автор: Alexeis 11.7.2008, 10:33
Цитата(Lazin @  11.7.2008,  09:12 Найти цитируемый пост)
а это компилируется?

  Ага, компилируется даже без ворнингов. 

Lazin, гм.. по поводу malloc/free я понимаю, проблема в том, что это не новая разработка, а уже написанная программа. Переписывать заново мне ее никто не даст, задача стоит в исправлении одного вредного AV. У меня делема то ли порча памяти происходит из-за удаления void* или память затирается в другом месте и нужно отлавливать момент порчи адреса.

Добавлено через 4 минуты и 20 секунд
Цитата(Mayk @  11.7.2008,  09:28 Найти цитируемый пост)
Не вызов деструкторов вполне достаточная причина для отказа от подобной конструкции.

  Я понимаю, в данном случае такую схему используют для удаления простых типов и простых структур, потому деструктора просто нет и это никак не может повлиять на правильность выполнения кода. Логически это неверно, я согласен, но чисто технически не критично.

Цитата(Mayk @  11.7.2008,  09:28 Найти цитируемый пост)
К тому же g++ сыпет предупреждения что deleting 'void*' is undefined

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

Автор: Lazin 11.7.2008, 11:19
я думаю что это UB, могу только предположить, что память будет освобождена, но деструктор вызван не будет...

Автор: Alexeis 11.7.2008, 11:33
Цитата(Lazin @  11.7.2008,  10:19 Найти цитируемый пост)
я думаю что это UB, могу только предположить, что память будет освобождена, но деструктор вызван не будет... 

  Я тоже вот встретил упоминание того что это undefined behavior http://lists.apple.com/archives/Xcode-users/2007/Jan/msg00355.html. Хотелось бы узнать точнее действиетльно ли это так или же можно не замарачиватся  этим вопросом и оставить код как есть.

Автор: JackYF 11.7.2008, 15:11
Цитата(Lazin @  11.7.2008,  10:19 Найти цитируемый пост)
я думаю что это UB, могу только предположить, что память будет освобождена, но деструктор вызван не будет... 

Дваждую. Я бы так не делал.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)