Содержит ли данный код UB

266
08 мая 2017, 02:26
#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;
}
Answer 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 - что получается...

Answer 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.

Answer 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;
}

И тогда все будет нормально

READ ALSO
Цвет консоли c++

Цвет консоли c++

Меняю цвет консоли этой строчкой, вопрос вот в чемКак после конкретных манипуляций восстановить дефолтный цвет консоли?

347
Поддержка разных языков

Поддержка разных языков

ЗдравствуйтеПроблема заключается в следующем

315
Smarty PHP модальное окно

Smarty PHP модальное окно

ЗдравствуйтеЕсть данный код на smarty, который добавляет на страницу формы для отправки информации на почту

372
Что в нем не правильно? В JS

Что в нем не правильно? В JS

хочу чтоб написал 25,144,9,121 и 49

279