Sky*_*eSM 2 c++ shared-ptr segmentation-fault c++11 raw-pointer
如果我这样做,
int* p = new int(10);
std::shared_ptr<int>(p);
delete p;
Run Code Online (Sandbox Code Playgroud)
这里发生了什么?shared_ptr删除原始指针后是无效的吗?在这种情况下,有没有办法确保内存访问安全?
您的问题中的代码包含2个相互冲突的定义p.我假设你打算发布类似的东西
int* p = new int(10);
std::shared_ptr<int> p1(p);
delete p;
Run Code Online (Sandbox Code Playgroud)
当shared_ptr超出范围并且其引用计数降至零时,它将尝试delete p;,导致双重删除和未定义的行为.
你已经将动态分配的所有权传递int给了shared_ptr,所以让它完成它的工作,不要去删除int你自己.
如果您希望API的客户端执行与上述代码类似的操作,则可以将API函数的参数类型从a 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
}
Run Code Online (Sandbox Code Playgroud)
然后,shared_ptr<int>客户端代码将调用上述函数,而不是传递a api_func<int>(10);.
| 归档时间: |
|
| 查看次数: |
1193 次 |
| 最近记录: |