我想在智能指针上获得一些建设性的意见。
C ++ 11标准定义了unique_ptr
和weak_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; }
// ...
};
答案 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 ,您可能会静态地知道,并且在您使用它时,您似乎经常需要知道这一点。那么,你丢弃这种类型的信息,然后重新构建它......为什么?