为什么 std::unique_ptr 阻止访问被销毁的对象?

Dmi*_*ano 5 c++

据我所知,下面的代码是正确的:

#include <iostream>
#include <functional>

struct A
{
    std::function<void ()> func;
    
    int value = 5;
    
    ~A() { func(); }
};

int main()
{
    A* p_a = new A();
    p_a->func = [&p_a]() { std::cout << p_a->value; };
    delete p_a;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

但以下代码不是并导致分段错误:

#include <memory>

int main()
{
    std::unique_ptr<A> p_a = std::make_unique<A>();
    p_a->func = [&p_a]() { std::cout << p_a->value; };
    p_a = {};
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

std::unique_ptr 首先清除其内部指针,然后删除该对象,从而防止访问被销毁的对象。

它是做什么用的?这背后的逻辑是什么?

S.M*_*.M. 2

此实现是为了防止 中的递归std::unique_ptr::reset()

std::unique_ptr当您通过引用获取时,您不拥有std::unique_ptr也不控制所引用对象的生命周期。正确的代码必须始终检查nullptr原始指针。

int main()
{
    std::unique_ptr<A> p_a = std::make_unique<A>();
    p_a->func = [&p_a]() { if (p_a) std::cout << p_a->value; };
    p_a = {};
    return 0;
}
Run Code Online (Sandbox Code Playgroud)