c++ - 对组合强/弱智能指针的看法

标签 c++ smart-pointers

我想获得一些有关智能指针的建设性意见。

C++11 标准定义了 unique_ptrweak_ptr,以便您可以将数据依赖关系建模为具有不会导致依赖循环的“弱”边的 DAG。 因此,强指针和弱指针之间的区别是在类型级别上建模的。

通过状态标志在运行时决定所有权的智能指针怎么样?

我们的库中有一个智能指针可以执行此操作,其主要优点是您可以指向堆或堆栈上的对象。

MyClass myObj;
my_ptr<MyClass> ptr(&myObj, Slave());
my_ptr<MyClass> ptr2(new MyClass(), Master());

您认为还有哪些其他优点和缺点? 到目前为止,我还没有在任何库中找到这样的智能指针,所以:我们是第一个看到此功能的必要性的人还是这是一个愚蠢/危险的想法?

感谢您的所有投入!

编辑

看来我的表述还不够清楚。 只能有一名主人和任意数量的奴隶。 这样,我提出的方案与弱/强指针不同,因为它更简单。

my_ptr 类仅存储指针和状态:

template <typename T>
class my_ptr
{
    enum PtrState { MASTER, SLAVE } };

    T * ptr;
    PtrState state;

    my_ptr() : ptr(), state(MASTER) {}
    // ...
    ~my_ptr() { if (state == MASTER) delete ptr; }
    // ...
};

最佳答案

shared_ptr让您编写自定义删除器:

struct DontDelete { template<class T> void operator()(T*) {} };

MyClass myObj;
std::shared_ptr<MyClass> ptr(&myObj, DontDelete());

该功能在许多其他情况下也很有用,例如shared_ptr<FILE>可以用 fclose 关闭文件:

FILE *f = fopen(...);
// throw if f couldn't open
std::shared_ptr<FILE> file(f, fclose);
// deletes f automatically

它比 your_ptr 更灵活.

关于c++ - 对组合强/弱智能指针的看法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9376067/

相关文章:

c++ - 指向数据成员与非成员的指针的隐式转换

c++ - 调试错误,在c++中调用了abort()

c++ - 在将 unique_ptr 移动到同一对象的基类构造后,使用指向对象的原始指针初始化字段

c++ - 智能指针和数组

c++ - 使用 unique_ptr 和自定义删除器包装 C 代码

C++ 静态多态性 (CRTP) 和使用派生类的 typedef

c# - 作为 "slave"调用的命令行程序被认为是动态链接的?

c++ - 使用 GDB 调试时如何知道 bison 中变量的值?

c++ - 具有共享指针和受限构造函数的工厂方法的问题

c++ - 智能指针 + "this"被认为是有害的?