ada*_*603 3 c++ smart-pointers shared-ptr
我在以下场景中:
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,并且只有一个指向已分配数据的原始指针,我可以将其传递给接收对象.
那可能吗?
static std::map m<data *, std::shared_ptr<data> >;
struct container {
data* ptr;
};
void someFunc(container* receiver /* wants to be filled */) {
auto myData = createData(); // returns shared_ptr<data>, I can't do anything about it
receiver->ptr = myData.get();
m[receiver->ptr] = myData;
}
void someOtherFunc(container* receiver)
{
// delete receiver->ptr;
m.erase(receiver->ptr);
}
Run Code Online (Sandbox Code Playgroud)
这延长shared_ptr了地图的寿命.