Страницы

Поиск по вопросам

четверг, 11 октября 2018 г.

Использование new(this)

Читаю C++ Super-FAQ. В разделе Constructors натыкаюсь такое высказывание:
BTW do NOT try to achieve this via placement new. Some people think they can say new(this) Foo(x, int(x)+7) within the body of Foo::Foo(char). However that is bad, bad, bad. Please don’t write me and tell me that it seems to work on your particular version of your particular compiler; it’s bad
Речь идет о том, то что так делать категорически нельзя:
class Foo{ public: Foo(char x){ new (this) Foo(x, int(x)+7); } Foo(char x, int y){ //... } };
Может кто-нибудь более подробно объяснить чем грозит такой трюк?
UPD: Подозреваю что в данном примере все будет нормально, и проблемы начнутся при наследовании, динамическом выделении ресурсов и т.п.


Ответ

http://ideone.com/gkgi7S
class Base { public: Base() { ptr = new int[100]; cout << "alloc mem at " << ptr << endl; } ~Base() { delete [] ptr; cout << "free mem at " << ptr << endl; } int * ptr; };
class Derived: public Base { public: Derived(int x, int y):x(x),y(y){} Derived(int x) { new(this) Derived(x,0); } int x, y; };
int main(int argc, const char * argv[]) { Derived d(5); }
Вывод:
alloc mem at 0070EA58 alloc mem at 0070FFE8 free mem at 0070FFE8
Такого примера достаточно?...
Можно и без наследования - суть не меняется:
class Derived { public: Derived(int x, int y):x(x),y(y){} Derived(int x) { new(this) Derived(x,0); } int x, y; Base b; };

Комментариев нет:

Отправить комментарий