这个问题在这里已经有了答案:
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/