据我所知,下面的代码是正确的:
#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 首先清除其内部指针,然后删除该对象,从而防止访问被销毁的对象。
它是做什么用的?这背后的逻辑是什么?
此实现是为了防止 中的递归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)