从中创建 shared_ptr 后删除原始指针
Delete raw pointer after creating a shared_ptr from it
如果我执行以下操作,
int* p = new int(10);
std::shared_ptr<int>(p);
delete p;
这里发生了什么? shared_ptr
删除原始指针后是否无效?这种场景下有什么方法可以保证内存访问安全吗?
您问题中的代码包含 2 个相互冲突的 p
定义。我假设你的意思是 post 类似
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>
如果我执行以下操作,
int* p = new int(10);
std::shared_ptr<int>(p);
delete p;
这里发生了什么? shared_ptr
删除原始指针后是否无效?这种场景下有什么方法可以保证内存访问安全吗?
您问题中的代码包含 2 个相互冲突的 p
定义。我假设你的意思是 post 类似
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>