#include <new>
struct Test
{
virtual void foo()
{
new ( this ) Test;
}
virtual void bar()
{
new ( this ) Test;
foo();
}
};
int main()
{
Test test;
test.bar();
return 0;
}
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 - что получается...
Стандартом не запрещено, создаю, где хочу.
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.
Насколько я понимаю, проблему, указанную @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;
}
И тогда все будет нормально
Как развивать веб-проекты в 2026 году: технологии, контент E-E-A-T и факторы доверия
Современные инструменты для криптотрейдинга: как технологии помогают принимать решения
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники