Компилятор (мучался BCB5) распознает размещающий оператор new и не вызывает оператор delete, если конструктор класса сгенерирует исключение. То есть конструкции вида
Здравствуйте, Коваленко Дмитрий, Вы писали:
КД>Сегодня ночью сделал очередное страшной открытие
КД>Компилятор (мучался BCB5) распознает размещающий оператор new и не вызывает оператор delete, если конструктор класса сгенерирует исключение. То есть конструкции вида КД>
КД>будут приводить к утечке памяти. И хотя это абсолютно логично, все равно — натуральная измена
А что бы ты хотел?
Вот, скажем, такой код:
allocate_memory(sizeof(T));
T();
тебя не парит?
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Я прав. Читай стандарт. Парный delete должен вызываться при исключениях.
Иначе это не C++, а какой-то другой язык.
КД>Более того, BCB5 такие пары не парят — он просто не понимает операторы delete отличные от КД>
книжке, размещающий оператор new обозначен как исключение из этого правила.
КД>>Более того, BCB5 такие пары не парят — он просто не понимает операторы delete отличные от
Ш>Это личное горе людей, использующих убогие компиляторы.
О да, конечно. Спасибо, что лишний раз напомнили.
-- Пользователи не приняли программу. Всех пришлось уничтожить. --
КД>>>Я думаю, что ты не прав.
Ш>>Я прав. Читай стандарт. Парный delete должен вызываться при исключениях.
КД>Я все равно не догнал — какой толк от delete в таком виде, если для размещающего оператора new он все равно не вызывется?
Как какой? Такой — есть у тебя перегруженный для класса void *operator new(std::size_t, void *); и есть парный ему оператор
void operator delete(void *, void *); Если в конструкторе (вызванном из new-expression, в котором использовался new с синтаксисом размещения и вызовом твоего оператора new(size_t, void *)) возникло исключение, то будет вызван (помимо всего прочего) парный operator delete. Не знаю, может у борланда и не вызовется. Кстати, по этому поводу с доисторических времен VC умел выдавать ворнинг в случае отсутствия парных операторов.
КД>Да, кстати. Вот в этой
Здравствуйте, Коваленко Дмитрий, Вы писали:
КД>Сегодня ночью сделал очередное страшной открытие
КД>Компилятор (мучался BCB5) распознает размещающий оператор new и не вызывает оператор delete, если конструктор класса сгенерирует исключение.
Дык и не должен . Передо мной лежит Страуструп "Язык программирования С++. Специальное издание" 2005 года, читаем параграф 10.4.11 "Размещение объектов" стр 304:
"Помещение объекта в память, которая (непосредственно) не управляется стандартным распределителем сводбодной памяти подразумевает определенные действия при уничтожении объекта. Базовым механизмом для этого является явный вызов деструктора:
void destroy(X* p, Arena* a)
{
p->~X();
a->free();
}
" Конец циататы.
Так в чем компилятор не прав? Тебе же сказали явный вызов деструктора! Так что ты от компилятора хочешь?
Здравствуйте, Lorenzo_LAMAS, Вы писали:
КД>>Я все равно не догнал — какой толк от delete в таком виде, если для размещающего оператора new он все равно не вызывется?
L_L>Как какой? Такой — есть у тебя перегруженный для класса void *operator new(std::size_t, void *); и есть парный ему оператор L_L>void operator delete(void *, void *); Если в конструкторе (вызванном из new-expression, в котором использовался new с синтаксисом размещения и вызовом твоего оператора new(size_t, void *)) возникло исключение, то будет вызван (помимо всего прочего) парный operator delete
книжке, размещающий оператор new обозначен как исключение из этого правила.
L_L>Нельзя ли цитату?
Книги под рукой нет. В конце 45 правила — исключения из правил. Общий смысл, который понял я — считается, что размещающий оператор new по-определению не занимается выделением памяти, поэтому парный delete ему не нужен.
Тем не менее, когда я закоментировал delete(void*,void*) VC7 выдал
e:\Users\Dima\Work\TestCode\compiler_test\test_008\main.cpp(55):
warning C4291: 'void *T1::operator new(size_t,void *)' :
no matching operator delete found;
memory will not be freed if initialization throws an exception
Так что теперь буду ломать голову — как спроектировать код, который бы понравился всем ... хотя да, конечно, __BORLANDC__ нам поможет
-- Пользователи не приняли программу. Всех пришлось уничтожить. --
P> Так в чем компилятор не прав? Тебе же сказали явный вызов деструктора! Так что ты от компилятора хочешь?
Автор говорит о другой ситуации, о возникновении исключения в new-expression, когда ты не сможешь вызывать деструкторов и функций и когда за тебя это сделает код, сгенеренный компилятором.
Кстати, как здесь уже обсуждалось, в С++ имеется какая-то асимметрия с placement-new, создавая объект при его помощи, разрушать приходится несимметричным корявым способом
Of course, the code must be complete enough to compile and link.
Здравствуйте, Lorenzo_LAMAS, Вы писали:
КД>>Да. Но я все равно его не брошу — потому что он хороший
L_L>Дождись их BCB 2006 Или как там его?
Да ладно, так и говори — Delphi 2006
На сколько я понял, эти свиномордии там оставили компилятор на уровне BCB6. Который, на мой взгляд, хуже чем BCB5
Хочется надеяться, что я заблуждаюсь — наш заказчик вроде заказал коробку этой студии — буду писать по-настоящему интересные программы
-- Пользователи не приняли программу. Всех пришлось уничтожить. --
Они вроде как по аналогии с VS теперь хотят иметь одну ИДЕ для Дельфи, С++ и С#
КД>На сколько я понял, эти свиномордии там оставили компилятор на уровне BCB6. Который, на мой взгляд, хуже чем BCB5
Интересно. В C Builder X года 1.5-2 назад у них был экспериментальный компилятор, использующий ЕДГ фронт-энд (и даже поддержка экспорта шаблонов была, хоть и работало все как-то криво-криво). Что же они, забили на него? Зачем бабло платили?
Of course, the code must be complete enough to compile and link.
Здравствуйте, Lorenzo_LAMAS, Вы писали:
L_L>Они вроде как по аналогии с VS теперь хотят иметь одну ИДЕ для Дельфи, С++ и С#
Да ну их в баню. КД>>На сколько я понял, эти свиномордии там оставили компилятор на уровне BCB6. Который, на мой взгляд, хуже чем BCB5
L_L>Интересно. В C Builder X года 1.5-2 назад у них был экспериментальный компилятор, использующий ЕДГ фронт-энд (и даже поддержка экспорта шаблонов была, хоть и работало все как-то криво-криво). Что же они, забили на него? Зачем бабло платили?
Я помню ты писал, что компилятор в BCBX вроде был новый. А у меня в триале этого индейского чуда был компилятор от BCB6 (SP4). Вот такая порнография
-- Пользователи не приняли программу. Всех пришлось уничтожить. --
КД>Я помню ты писал, что компилятор в BCBX вроде был новый. А у меня в триале этого индейского чуда был компилятор от BCB6 (SP4). Вот такая порнография
Нужно было отдельно качать Borland Technical Preview. Вообще удивительно. Изначально вроде как по части С++ компиляторов Борланд был не так уж плох, многие вещи они сделали первыми, придумали какие-то продвинутые по тем временам технические решения. Видать поставили они крест на этом деле
Of course, the code must be complete enough to compile and link.
Здравствуйте, Lorenzo_LAMAS, Вы писали:
КД>>Я помню ты писал, что компилятор в BCBX вроде был новый. А у меня в триале этого индейского чуда был компилятор от BCB6 (SP4). Вот такая порнография
L_L>Нужно было отдельно качать Borland Technical Preview. Вообще удивительно. Изначально вроде как по части С++ компиляторов Борланд был не так уж плох, многие вещи они сделали первыми, придумали какие-то продвинутые по тем временам технические решения. Видать поставили они крест на этом деле
Да нет. Просто люди, которые это делали, ушли в Майкрософт.
(причем это была не заслуга Майкрософта, а "заслуга" сменившегося руководства Борланда, типа -- а что эти люди здесь делают, а не слишком ли много мы им платим и.т.п.)
Ш>Да нет. Просто люди, которые это делали, ушли в Майкрософт. Ш>(причем это была не заслуга Майкрософта, а "заслуга" сменившегося руководства Борланда, типа -- а что эти люди здесь делают, а не слишком ли много мы им платим и.т.п.)
Достоверная информация? Я знаю только, что С# делает один из создателей Дельфи или что-то в этом роде.
Of course, the code must be complete enough to compile and link.