2012-02-21 67 views
2

我想在智能指针上获得一些建设性意见。关于组合强/弱智能指针的意见

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; } 
    // ... 
}; 
+0

弱指针需要调用'lock()'来获得对象,但强指针不需要。你如何解决这种差异?你是否总是使用'lock()'并且在Master中不做任何事情? – rodrigo 2012-02-21 14:40:28

+0

@rodrigo:也许我忽略了这一点,但我需要'lock()',在我的编辑中也可以找到一些可能的解释。 – Manuel 2012-02-21 15:26:14

+0

但是,从属指针有什么意义。它只是一个包含在'my_ptr'中的普通指针,没有任何新东西。如果主人被摧毁,那么所有的奴隶都会徘徊......而这正是弱指针应该避免的。 – rodrigo 2012-02-21 16:16:30

回答

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更加灵活。你的计划的

+0

这与Manuel所描述的不完全是正交的行为吗?即添加自定义删除器的可能性与该能力完全无关,可以清楚地区分主从指针吗?还是有什么我在这里失踪? – LiKao 2012-02-21 11:10:22

+0

@李高:我的理解是,OP误解了weak_ptr是什么。我很确定他的'Slave()'指针是一个普通的旧指针,而不是一个弱指针。否则,我无法看到有问题的代码如何工作。 – ybungalobill 2012-02-21 11:13:49

+0

@ybungalobill:是的,显然我误解了'weak_ptr',谢谢你指出了这一点。 – Manuel 2012-02-21 11:37:58

1

一个可能的缺点是,任何my_ptr操作可以抛出,除非你能确保你目前正与指针是之一。

我想你可以明确地促进你的工作指针状态无处不在,你需要控制的寿命,但没有类型系统在这里给你任何帮助,我希望很多功能都需要做到这一点明确的推广只是在案件。特别是在多线程代码中,请注意,指针的非引用可能会失败。

想必你知道静态当您创建一个指向它是否是一个,而且好像你往往还需要知道这一点,当你使用它。所以,你放弃了这种类型的信息,然后重新构造它......为什么?