在我的代码中,我希望boost :: shared_ptr不要调用delete但是调用ptr-> deleteMe()代替.
我还有一些C风格的函数返回一个ptr.我可以调用lib_freeXYZ(ptr); 而不是试图删除?
C++ 11有相同的东西boost::intrusive_ptr吗?
我的问题是我的C++代码有一个C风格的界面.接口的两端都可以使用C++,但出于兼容性原因需要公开C接口.我无法使用,std::shared_ptr因为我必须通过两个(或更多)智能指针来管理对象.我无法找到类似的解决方案boost::intrusive_ptr.
boost::intrusive_ptr要求intrusive_ptr_add_ref和intrusive_ptr_release定义.为什么不提供基类来执行此操作?这里有一个例子:http://lists.boost.org/Archives/boost/2004/06/66957.php,但海报上写着"我不一定认为这是一个好主意".为什么不?
更新:我认为这个类可能被多重继承滥用的事实是不够的.从具有自己的引用计数的多个基类派生的任何类都将具有相同的问题.这些refcounts是否通过基类实现是没有区别的.
我认为多线程没有任何问题; boost::shared_ptr提供原子引用计数,这个类也可以.
在我的代码中,我在涉及intrusive_ptrs时遵循两条规则:
许多互联网评论者写道,除了使用第三方代码外,shared_ptr应优先于intrusive_ptr.但是,intrusive_ptr避免了传递智能指针,因为您可以从原始指针创建intrusive_ptr,就像在函数的生命周期之外需要对象一样.
我只是担心我遗漏了一些东西,因为我读过的任何东西都没有说明关于intrusive_ptrs的观点,并且大多数人似乎更喜欢shared_ptrs,即使它们引入内存开销以及使用enable_shared_from_this和继承时的问题.
这在我的代码中已经成为一种常见模式,因为当我需要管理一个需要不可复制的对象时,因为它是"重"或B.它是操作系统资源,例如关键部分:
class Resource;
class Implementation : public boost::noncopyable
{
friend class Resource;
HANDLE someData;
Implementation(HANDLE input) : someData(input) {};
void SomeMethodThatActsOnHandle() {
//Do stuff
};
public:
~Implementation() { FreeHandle(someData) };
};
class Resource
{
boost::shared_ptr<Implementation> impl;
public:
Resource(int argA) explicit {
HANDLE handle =
SomeLegacyCApiThatMakesSomething(argA);
if (handle == INVALID_HANDLE_VALUE)
throw SomeTypeOfException();
impl.reset(new Implementation(handle));
};
void SomeMethodThatActsOnTheResource() {
impl->SomeMethodThatActsOnTheHandle();
};
};
Run Code Online (Sandbox Code Playgroud)
这样,shared_ptr处理引用计数问题,允许Resource可复制,即使基础句柄只有在对它的所有引用都被销毁后才应该关闭.
但是,似乎我们可以节省分配shared_ptr的引用计数的开销,如果我们可以在Implementation某种程度上移动内部数据,就像boost的侵入式容器那样.
如果这使得过早的优化讨厌唠叨某些人,我实际上同意我不需要这个用于我当前的项目.但我很好奇是否有可能.