2012-02-21 70 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操作可以拋出,除非你能確保你目前正與指針是之一。

我想你可以明確地促進你的工作指針狀態無處不在,你需要控制的壽命,但沒有類型系統在這裏給你任何幫助,我希望很多功能都需要做到這一點明確的推廣只是在案件。特別是在多線程代碼中,請注意,指針的非引用可能會失敗。

想必你知道靜態當您創建一個指向它是否是一個,而且好像你往往還需要知道這一點,當你使用它。所以,你放棄了這種類型的信息,然後重新構造它......爲什麼?