Является ли следующий код законным? Мое беспокойство - использование метода .release
после того, как объект был разрушен в методе Start
.Освобождение unique_ptr после уничтожения объекта
class Foo
{
public:
Foo()
{
std::cout << "Foo ctor\n";
}
~Foo()
{
std::cout << "Foo dtor\n";
}
void Start()
{
std::unique_ptr<Foo> ptr(this);
}
};
int main(int argc, char* argv[])
{
auto ptr = std::make_unique<Foo>();
ptr->Start();
ptr.release();
}
Я пробовал это в vs12, и он не жаловался.
Совершенная способ стрелять из собственной ноги – user3159253
временный экземпляр внутри 'Start()' будет уничтожен, когда 'Start()' завершено, по существу удаляя 'this' – user3159253
Так как указатель является' release() 'd сразу же, ничего особо опасного происходит, но между 'ptr-> Start()' завершение и 'ptr.release()' invocation 'ptr' владеет разрушенным объектом, который определенно co uld приводят к сбоям и повреждению памяти. – user3159253