结合强弱智能指针的意见

时间:2012-02-21 10:39:12

标签: 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; }
    // ...
};

2 个答案:

答案 0 :(得分:3)

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更灵活。

答案 1 :(得分:1)

您的方案的一个可能的缺点是任何 my_ptr操作都可能抛出,除非您可以确定您当前使用的指针是 Master 一。

我猜你可以在需要控制生命周期的任何地方明确地提升你的 Master 状态的工作指针,但是没有类型系统在这里给你任何帮助,我希望很多函数都需要这样做明确的促销以防万一。特别是在多线程代码中,请注意非 Master 指针的任何取消引用都可能失败。

当您创建指针时,无论是 Master 还是 Slave ,您可能会静态地知道,并且在您使用它时,您似乎经常需要知道这一点。那么,你丢弃这种类型的信息,然后重新构建它......为什么?