【发布时间】:2015-03-08 02:40:51
【问题描述】:
我处于以下情况:
struct container {
data* ptr;
};
void someFunc(container* receiver /* wants to be filled */) {
auto myData = createData(); // returns shared_ptr<data>
receiver->ptr = myData.get();
}
生成数据的函数和接收数据的对象是两个不同库的一部分,我无法修改它们的源代码。我必须处理这些数据类型,对此我无能为力。
所以我必须实现一个获取一些数据的函数,然后将指向该数据的指针传递给一个对象。我的问题是创建我的数据的函数返回一个 shared_ptr 实例给它。需要数据的对象只会接受指向它的原始指针。
如您所见,我在shared_ptr 上调用get() 以获取原始指针并将其传递给接收对象。如果我没记错的话,shared_ptr 会在超出范围时减少引用计数。所以在这种情况下,这意味着它会在函数返回后立即销毁我的数据,因为引用计数将达到 0。
那么我怎样才能在不破坏托管对象的情况下摆脱shared_ptr 实例呢?我将数据传递给的对象(为简单起见,用“容器”结构说明)确实负责其析构函数内部的内存清理,因此我不需要任何引用计数或类似的东西。我不想再监视分配的数据(接收指向它的指针的对象除外)。我想摆脱shared_ptr,只有一个指向分配数据的原始指针,我可以将它传递给接收对象。
这可能吗?
【问题讨论】:
-
有什么特殊原因不能让容器接受共享指针吗?它们的全部意义在于您无需担心生命周期管理。如果不需要,不要使用原始指针。
-
@aruisdante 我知道,我尽可能在所有项目中使用智能指针。但在这种情况下,
createData和container都是某些库的一部分,我无法修改(即两个不同的库。这就是为什么它们不会说相同的“语言”)。 -
复制数据。您有两件事需要控制数据的生命周期,这需要两个副本。
-
@DavidSchwartz 虽然它不是最有效的,但它可能是最易读、可维护和最安全的方式。
标签: c++ shared-ptr smart-pointers