boost :: shared_ptr可以释放存储的指针而不删除它吗?
我可以看到文档中没有发布功能,也在FAQ中解释了为什么它不提供发布功能,类似于发布不能在不唯一的指针上完成.我的指针是独一无二的.我该如何发布我的指针?或者哪个提升智能指针类使用,这将允许我释放指针?我希望你不要说使用auto_ptr :)
我们有一个C++库,我们提供给几个不同的客户端.最近我们改用了在公共接口中使用原始指针而不是使用boost :: sharedptr.正如您可能猜到的那样,这提供了巨大的好处,因为现在客户不再需要担心谁需要删除什么以及何时删除.当我们进行切换时,我认为这是正确的做法,但是让我感到困扰的是我们必须在公共界面中包含来自第三方库的内容 - 如果可以的话,通常会避免这种情况.我认为提升实际上是C++语言的一部分,我们的用例要求客户端代码和库都保存指向对象的指针.然而,最近我们的一位客户问我们是否可以在界面中切换到使用中性智能指针类,因为我们的图书馆实际上是强迫他们使用特定版本的提升 - 这一点我当然理解和欣赏.所以现在我想知道什么是最好的行动方案.我已经考虑了一下,并想知道如何创建一个简单的智能指针类,它只是一个真正的提升智能指针.但是客户端可能会立即将其中一个填充到boost :: sharedptr中,然后我们将深入分析三个 - 这可能是一个问题,或者可能不是.无论如何,我很想听听社区关于解决这个问题的最佳方法的一些意见.我已经考虑了一下,并想知道如何创建一个简单的智能指针类,它只是一个真正的提升智能指针.但是客户端可能会立即将其中一个填充到boost :: sharedptr中,然后我们将深入分析三个 - 这可能是一个问题,或者可能不是.无论如何,我很想听听社区关于解决这个问题的最佳方法的一些意见.我已经考虑了一下,并想知道如何创建一个简单的智能指针类,它只是一个真正的提升智能指针.但是客户端可能会立即将其中一个填充到boost :: sharedptr中,然后我们将深入分析三个 - 这可能是一个问题,或者可能不是.无论如何,我很想听听社区关于解决这个问题的最佳方法的一些意见.
编辑:我原先说的是所有权的转移,但是我应该指定API边界两侧的代码需要保存一个指向该对象的指针.
我正在用 C 开发一个应用程序,我需要在其中使用 3rd 方 C++ 库。所以,我基本上是在围绕 C++ 库编写一个包装器,以便可以从我的纯 C 应用程序中调用它。库中的某些方法返回 boost::shared_ptr 类型的指针,我需要将其转换为void* [for C] 然后将其转换回 boost::shared_ptr 类型以重用它进行进一步处理。我使用以下方法进行转换:
作废*:
void * func1()
{
//after the boost::shared_ptr is created
return static_cast<void *> (SHARED_PTR.get())
}
Run Code Online (Sandbox Code Playgroud)
从 void* :
void func2(void * VOID_PTR) //VOID_PTR returned by func1
{
boost::shared_ptr<T> SHARED_PTR = *(boost::shared_ptr <T> *)(VOID_PTR);
}
Run Code Online (Sandbox Code Playgroud)
但是,我在 func2 中收到了 SIGSEGV,我相信这是因为 shared_ptr 被释放,因为它的引用计数为 0。
我正在寻找正确的方法来进行这种转换以及来自 SO 社区专家的建议。
提前致谢!
我们的应用程序的设计非常差-它既使用std::shared_ptr和QObject亲子关系来管理我们的一些对象。当QObject::~QObject删除其子对象,然后shared_ptr尝试也将其删除时,这会导致段错误。
我们讨论了此问题,但目前尚无轻松解决此问题的方法,因此在我们对其进行修复之前,我将需要使用一些肮脏的技巧。
现在我有一个std::shared_ptr<MyObject> getMyObjectPtr()功能。我需要将结果放入QPointer<MyObject>-QPointers是弱指针,仅指示他们管理的QObject是否已删除。我无法以任何方式更改该功能,它将破坏整个应用程序。
我使用自定义脱发器尝试了一些技巧,但这似乎行不通。
// get the shared_ptr from inacessible API
std::shared_ptr<MyObject> oldPtr(getMyObjectPtr());
// create a new pointer that never deletes it's value
std::shared_ptr<MyObject> newPtr(nullptr, [](MyObject*) {});
// Move pointer from old to new non-deleting ptr
newPtr.swap(oldPtr);
QPointer<MyObject> qptr(newPtr.get());
Run Code Online (Sandbox Code Playgroud)
但是,以这种方式,一旦函数结束,指针将被删除。大概,自定义脱机器与数据一起移动。
我正在尝试释放一个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特定的解决方案)。
在将功能从C ++库公开给Java时,我最近遇到了有关C ++ shared_ptr指针的问题。情况是,对象本身以及jlong与该对象相关的句柄位于Java部分中,但随后的结构使用智能指针访问该对象。
我得到的问题是:当智能指针被破坏或重置时,基础对象也将被删除。但是,Java参考仍然指向该对象。
我做了很多尝试,但没有设法在Java方面保留所有权。是否有针对该问题的最佳实践或解决方案?
我目前正在重构代码的一些旧部分。我正在研究的方法大量使用new和delete功能来实现其目的。我可以轻松地用共享指针替换所有这些,以获得更好的代码清晰度和安全性。问题是,最终我需要返回一个指向已分配内存的指针以匹配 API。这不适用于共享指针。
我可以分配一个新的内存块并new复制分配的内存内容shared_ptr(我的第一个想法)。但后来我想也许有一种机制可以告诉shared_ptr不要在上下文丢失时释放分配的内存?这样我就可以通过共享 ptr 返回指向已分配内存的指针,而无需释放它。