2013-05-01 87 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_