从中创建shared_ptr后删除原始指针

时间:2015-06-09 04:41:58

标签: c++ c++11 segmentation-fault shared-ptr raw-pointer

如果我执行以下操作,

int* p = new int(10);
std::shared_ptr<int>(p);
delete p;

这里发生了什么?删除原始指针后shared_ptr无效吗?在这种情况下,有没有办法确保内存访问安全?

1 个答案:

答案 0 :(得分:6)

您问题中的代码包含2个p的冲突定义。我假设您打算发布类似

的内容
int* p = new int(10);
std::shared_ptr<int> p1(p);
delete p;

shared_ptr超出范围且其引用计数降至零时,它将尝试delete p;,从而导致双重删除和未定义的行为。

您已将动态分配的int的所有权转让给shared_ptr,因此请让它完成其工作,并且不要自行删除int

如果您希望API的客户端执行与上述代码类似的操作,则可以将API函数的参数类型从shared_ptr更改为构造函数参数的参数包。例如

template<typename T, typename... Args>
void api_func(Args&&... args)
{
    auto p = std::make_shared<T>(std::forward<Args>(args)...);
    // Use the shared_ptr p as before
}

然后,客户端代码不会传递shared_ptr<int>,而是将上述函数称为api_func<int>(10);