我的接口函数返回一个指向对象的指针.用户应该拥有该对象的所有权.我不想返回Boost.shared_ptr,因为我不想强制客户端使用boost.但是,在内部,我想将指针存储在shared_ptr中,以防止在异常等情况下发生内存泄漏.似乎无法从共享指针中分离指针.这里有什么想法?
我正在尝试释放一个shared_ptr(您可以释放一个unique_ptr)。我知道当shared_ptr不唯一时这没有意义,但我有一个保证是唯一的shared_ptr。我试过了...
m_pObj.reset((T*)nullptr, [](T* const){});
Run Code Online (Sandbox Code Playgroud)
...但它只是删除了该对象。我不确定如果shared_ptr最终调用delete,删除器参数有什么用处。
有什么方法可以实现这一点(如果没有其他方法,欢迎使用VS2010特定的解决方案)。
我在以下场景中:
struct container {
data* ptr;
};
void someFunc(container* receiver /* wants to be filled */) {
auto myData = createData(); // returns shared_ptr<data>
receiver->ptr = myData.get();
}
Run Code Online (Sandbox Code Playgroud)
生成该数据的函数和接收它的对象是两个不同库的一部分,我无法修改它的源代码.我必须使用这些数据类型,我无能为力.
所以我必须实现一个获取一些数据的函数,然后将指向该数据的指针传递给一个对象.我的问题是创建我的数据的函数,返回一个shared_ptr实例.需要数据的对象只接受指向它的原始指针.
如您所见,我调用get()它shared_ptr来获取原始指针并将其传递给接收对象.如果我没有弄错,那么shared_ptr只要它超出范围,就会减少引用计数.所以在这种情况下,这意味着它会在函数返回时立即销毁我的数据,因为引用计数将达到0.
那么如何在shared_ptr不破坏托管对象的情况下摆脱实例呢?我传递数据的对象(为简单起见用"容器"结构说明)确实在其析构函数中处理内存清理,因此我不需要任何引用计数或类似的东西.我不想再监视分配的数据(除了接收指向它的指针的对象).我想摆脱它shared_ptr,并且只有一个指向已分配数据的原始指针,我可以将其传递给接收对象.
那可能吗?