C++:对象的引用计数器

标签 c++ shared-ptr raii

我需要一个未在堆上分配的对象的引用计数器。

我需要它在无法轻易复制和销毁的对象上实现 RAII 机制:

class File
{
private:
    int fd;
public:
    File( const std::string &path ) ... // opening file
    destroy( );                         // actually closing file

    File( const File &f ) ...           // just copying the fd
    ~File( );                           // doing nothing
}

对于像这样的场景,通常使用 std::shared_ptr:共享指针的对象的构造函数和析构函数只调用一次。

然而,在我的例子中,我宁愿避免在堆上分配对象。我需要一个 shared_object 类来完成类似于 std::shared_ptr 的工作,以便我的类的非复制构造函数和 destroy 函数(在上面的例子中)只被调用一次。

有这样的东西吗?

最佳答案

如果您希望在动态存储(“堆上”)中分配 时具有共享指针行为,您可以查看various smart pointer implementation strategies .在 Modern C++ Design ,作者在“智能指针”一章中讨论了其中的许多策略,即 freely (and legally) available online .

您会感兴趣的技术是引用链接。使用这种技术,智能指针对象在双向双向链表中链接在一起,而不是指向动态分配的引用计数器。


综上所述,使用 std::shared_ptrstd::unique_ptr 或它们的 Boost 变体可能会编写得更快并且更易于维护。如果动态分配和引用计数曾经是瓶颈(我怀疑它会是,但我们不能仓促概括),您总是可以花时间使用自定义引用链接版本。

关于C++:对象的引用计数器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9935911/

相关文章:

c++ - 与 Direct3D SpriteBatch 混合

c++ - 从不在 PIMPL 中提供析构函数(使用 boost scoped_ptr),g++(4.6.1) 不会生成编译错误,为什么?

c++ - 如何修复堆损坏

c++ - zeromq 3.1 C++ API 'device' 不是 'zmq' 的成员

c++ - 我碰到了这个代码片段,不明白。它递归检查c++字符串中是否存在大写字符

c++ - 可以这样声明for循环吗?

c++ - 如何在不取消定义类型的情况下为 C++ 中的类型编写 getter?

c++ - 包裹在共享指针中时的 vector 构造

c++ - 关于智能指针及其不可避免的非决定论的问题

c++ - 带有 COM 对象数组的 RAII