创建shared_ptr后删除裸指针



如果我执行以下操作,

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

这里发生了什么?删除原始指针后,shared_ptr是否无效?在这种情况下,是否有任何方法可以确保内存访问安全?

您问题中的代码包含两个相互冲突的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
}

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

最新更新