2

所以你有 type 的 objectx和 type 的Xobject y YX并且Y是相关的,并且要求y在其相关之前被销毁x

换句话说,像这样:

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.

在这种情况下,你能想出任何方法来创建编译时错误,或者我们是否坚持运行时断言?

4

2 回答 2

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_;
};
于 2013-05-01T18:41:27.167 回答
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_

于 2013-05-01T19:10:27.860 回答