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

标签 c++

这个问题在这里已经有了答案:





std::unique_ptr reset() order of operations

(2 个回答)


24 天前关闭。




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

#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;
}
但以下代码不是并导致段错误:
#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;
}
std::unique_ptr首先清除其内部指针,然后删除该对象,从而防止访问被销毁的对象。
它是做什么用的?这背后的逻辑是什么?
编辑 1:
标记的问题是重复的。我更喜欢 std::uniqu_ptr如果删除器抛出异常,则保留旧对象(如果我没有误解的话)。

最佳答案

这个实现是为了防止 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;
}

关于c++ - 为什么 std::unique_ptr 阻止访问被销毁的对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69056364/

相关文章:

C++ 成员函数链接返回类型和派生类

c++ - 将 int 转换为 char* 时出现奇怪的输出

c++ - 指向 const 的指针可以指向非常量对象 - 语言设计或技术原因?

c++ - 具有非常量变量大小的编译时数组初始化

c++ - c++中的虚函数需要一个实现而没有实现它会给出错误

c++ 类并在其中定义函数?

java - 与线程一起使用的音乐库

c++ - Windows 下 C++ 的 GUI 框架/库

c++ - 什么会导致互斥体行为不端?

c++ - 如何将可选参数传递给 C++ 中的方法?