Страницы

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

среда, 22 января 2020 г.

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

#cpp


#include 

struct 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; } И тогда все будет нормально

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

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