|
ru.linux- RU.LINUX --------------------------------------------------------------------- From : Aleksey Cheusov 2:5020/400 31 Jan 2003 23:14:44 To : Valentin Nechayev Subject : Re: 386SX and RedHat_8.0 -------------------------------------------------------------------------------- Valentin Nechayev <netch@segfault.kiev.ua> writes: > >>> Victor Wagner wrote: > > VW> int SomeClass::SomeMethod { > VW> SomeOtherClass* foo = new SomeOtherClass(); > VW> // Вот тут-то оно exception и кинет > VW> int result=foo->SomeMethod(); > VW> delete foo; > VW> return result; > VW> } > VW> Вопрос - кто в данном случае освободит динамическую память, в которой > VW> размещен объект foo? > VW> Данным называется случай, когда foo->SomeMethod выкинул exception. > > Это штатная проблема и для неё есть штатные методы решения. > Hапример, auto_ptr. Идёт в стандартной библиотеке, кажется. Если класс создаётся и удаляется в пределах одной функции, то IMHO нечего его в хипе создавать. auto ничем не хуже (ну разьве что efence может не сработать) и избавляет от проблем с неожиданными exceptions. В итоге код получается пости такой же как в языках с garbage collector. А объект если создаётся и удаляется в разных функциях, то не надо поинтеры по аргументам функций тоскать, сделай его (указатель) мембером, напиши корректный clear/destructor и никогда у тебя не будет проблем с memory leaks. Если хочешь обеспечить хоть какой-нибудь code reuse, то возможные состояния объекта по-крайней мере держать в голове нужно и корректный clear IMHO всегда нужно писать. Т.е. auto_ptr IMHO не кассу, т.е. в кассу, но не в таких простых случаях. > > VW> Этот случай, естественно, чрезмерно упрощенный. Достаточно сделать > VW> объект foo статическим и мусора не будет. Hо бывают и более сложные > VW> случаи. Hапример, если SomeOtherClass - pure abstract class, > VW> которому присваеивается объект одного из десятка производных классов. > > Hу и? Виртуальный деструктор через указатель работает для любого > производного класса. Если pure abstract class совсем даже не pure, а совсем наоборот, и содержит виртуальный деструктор, то, конечно, да. В мелкомягком COM для этого есть для этого специальная функция типа ReleaseInstance или как-то так с reference counter-ом внутри. Hу, это для того быть pure abstract. -- Best regards, Aleksey Cheusov. --- ifmail v.2.15dev5 * Origin: Science Soft (2:5020/400) Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.linux/17283dc995626.html, оценка из 5, голосов 10
|