3

如果我执行以下操作,

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

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

4

1 回答 1

6

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

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

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

您已经将动态分配的所有权传递intshared_ptr,所以让它完成它的工作,不要去删除int自己。


如果您希望 API 的客户端执行与上述代码类似的操作,一种可能性是将 API 函数的参数类型从 ashared_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);.

于 2015-06-09T04:45:46.250 回答