我想获得一些有关智能指针的建设性意见。
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; }
// ...
};
最佳答案
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/