#cpp
#includestruct Test { virtual void foo() { new ( this ) Test; } virtual void bar() { new ( this ) Test; foo(); } }; int main() { Test test; test.bar(); return 0; }
Ответы
Ответ 1
UB вряд ли (хотя пусть это подтвердят гуру в стандартах), но вот огрести так неприятностей - запросто. Представим, что Test запрашивает какой-то ресурс, скажем, память. struct Test { Test() { cout << "Выделяем кучу памяти\n"; } ~Test() { cout << "Освобождаем кучу памяти\n"; } virtual void foo() { new ( this ) Test; } virtual void bar() { new ( this ) Test; foo(); } }; int main() { Test test; test.bar(); return 0; } Сами смотрите - http://ideone.com/kvspoc - что получается...Ответ 2
Стандартом не запрещено, создаю, где хочу. A program may end the lifetime of any object by reusing the storage which the object occupies or by explicitly calling the destructor for an object of a class type with a non-trivial destructor Но как уже упомянуто в другом ответе и сказано в стандарте: ... the destructor shall not be implicitly called and any program that depends on the side effects produced by the destructor has undefined behavior.Ответ 3
Насколько я понимаю, проблему, указанную @Harry можно обойти следующим образом: struct A { A() { cout << "Alloc memory" << endl; } virtual ~A() { buzz(); } virtual void buzz() { cout << "Dealloc memory" << endl; } virtual void foo() { buzz(); new (this) A; } virtual void bar() { buzz(); new (this) A; foo(); } }; int main() { A test; test.bar(); return 0; } И тогда все будет нормально
Комментариев нет:
Отправить комментарий