2013-05-01 83 views
2

因此,您有對象x類型X和對象y類型YXY是相關的,並且要求在其相關的x之前銷燬y編譯時間壽命檢查

換句話說,像這樣:

struct X { void do_something(); } 
struct Y 
{ 
    Y(X&x) : my_x(&x) {} 
    void do_something() { my_x->do_something(); } 
private: 
    X * my_x; 
}; 

被你想使用智能指針,上述my_x防禦程序員。但據我所知,沒有合適的指針。這個指針需要知道它不擁有它的原始指針,並且它不應該超過它指向的對象。

我認爲大多數情況下這是不可能在編譯時顯示的。然而,在某些情況下,可以證明y不合適地超過其x

當你遇到這種情況,或者我們遇到一個運行時斷言時,你能想出任何方法來創建編譯時錯誤嗎?

+2

由於生命週期的範圍不能通過靜態分析來確定,很難想象編譯時的執行。 – 2013-05-01 17:30:09

+0

如果您需要序列化確保您的運行時尚未提供,請執行您自己的測序。 – jthill 2013-05-01 17:30:22

+0

你是什麼意思被銷燬?你能否把'X'作爲'Y'析構函數中的最後一個語句來銷燬? – 2013-05-01 17:33:37

回答

1

這不能解決您的問題嗎?它確保相關的Y總是在X之前銷燬。

struct X; 

struct Y 
{ 
    Y(X& x) : my_x(&x) {} 
    void do_something() { my_x->do_something(); } 
private: 
    X* my_x; 
}; 

struct X 
{ 
    X() : owned_y_(this) { } 
    void do_something(); 
private: 
    Y owned_y_; 
}; 
+2

'X'大概是有用的,而不僅僅是'Y'。 – 2013-05-01 19:13:21

+0

本是正確的... – 2013-05-01 19:42:47

1

你可以試試這個

struct X { void do_something(); } 
struct Y 
{ 
    Y(X&x) : my_x(&x) {} 
    void do_something() { my_x->do_something(); } 
private: 
    X * my_x; 
}; 


struct XY_Holder{ 
    X x_; 
    Y y_; 
    XY_Holder():x_{},y_{&x_}{} 
}; 

的X_和Y_對象將按順序或聲明來構建和以相反的順序破壞,因此編譯器將確保Y_不會拖垮X_