【发布时间】:2019-06-05 20:13:08
【问题描述】:
我正在编写一个库,它在 kdb+(尽管这个问题通常适用于外语接口)和一个 C++ 库之间进行接口,其中大多数 API 调用返回一个std::shared_ptr。在使用 kdb+ 与大多数库交互时,通常使用库的 API 创建对象,然后将其原始指针作为 long long 返回,以便 kdb+ 程序员可以根据自己的选择将对象发送回库。
共享指针使这变得困难。最小的例子:
extern "C" K k_new_foo() {
// not using auto for the sake of clarity in the example
std::shared_ptr<library::Foo> ptr = library::Foo::Create();
// return the raw pointer as a long long int in a kdb object
return kj(reinterpret_cast<long long>(ptr.get()));
}
// ptr goes out of scope -> the library::Foo is freed prematurely
我想知道是否有某种方法可以无限期延长std::shared_ptr 的生命周期,或者以其他方式防止破坏它指向的数据,直到程序员使用另一个调用从 kdb+ 中手动释放它到这个接口库。我很清楚我所要求的违背了使用智能指针的目的;我很想知道一种好的方法来处理这个问题,如果这样的事情存在并且是实用的。
【问题讨论】:
-
您是否考虑过“新建”一个新的 shared_ptr 并将其传递给其他语言?
-
泄露共享 ptr 的原始 ptr 是危险的。
-
可能有办法做到这一点,但我非常怀疑它们中的任何一种都符合好的条件。您想明确规避
library(共享所有权管理)明确实施的安全机制。你坚定地致力于进入糟糕的代码领域。 -
我不期待一些神奇的完美解决方案,但问也无妨。
-
@WillDaSilva 我当然不是要批评这个问题。有时您会发现自己处于需要任何解决方案的困境中,即使是糟糕的解决方案。我的意思是评论最后一句话,我认为可能没有任何好方法,只有方法。
标签: c++ c++17 shared-ptr smart-pointers kdb