Tob*_*ull 8 c++ destructor this object-lifetime c++11
在一些主对象的析构函数中在堆栈上创建一个worker-object并将master-object的this指针传递给helper-object 是合法的C++ 吗?然后,辅助对象还将调用主对象的成员函数或访问成员变量.
换句话说,是以下合法的C++?
struct MasterClass
{
  MasterClass (int data);
  ~MasterClass ();
  int data;
};
struct WorkerClass
{
  WorkerClass (MasterClass *m) : m (m) { }
  void do_some_work () { m->data = 42; }
  MasterClass *m;
};
MasterClass::MasterClass (int data)
: data (data)
{ }
MasterClass::~MasterClass ()
{
  WorkerClass w (this);
  w.do_some_work ();
}
int main ()
{
  MasterClass m (7);
}
我知道,一旦析构函数开始执行,master-object的生命周期就会结束.但我认为在任何对象的析构函数中调用非虚拟成员函数是合法的,这些函数使用隐式this参数/参数.
是的,不是.
是的,因为它在这个非常短的例子中是合法的,你已经证明了.
不,因为它可能导致UB,在破坏期间有一些关于对象使用的警告
TLDR如果你没有任何继承,那总是很好.
现在,它在哪里的情况下,不罚款的破坏过程中使用的对象.
以下情况将假定已经编写了以下内容
struct V;
struct A;
struct B;
struct D;
void foo(A* a = nullptr);
struct V {
    virtual void f();
    virtual void g();
};
struct A : virtual V {
    virtual void f();
};
struct B : virtual V {
    virtual void g();
    ~B() {
        foo();
    }
};
struct D : A, B {
    virtual void f();
    virtual void g();
    ~D() {
        foo(this);
    }
};
int main() {
    D d;
}
破坏之后x(也就是说它的析构函数被调用)
如果虚函数调用使用显式类成员访问,并且对象表达式引用
x该对象的基类子对象x或其中一个基类子对象的完整对象,则该行为未定义.
这意味着,如果您使用显式类成员访问来调用指向整个指针的虚函数x,但不知何故指针不是其类型x或其基础,则行为未定义.
void foo(A* a) {
    static auto ptr = a;
    ptr->g();  // UB when called from ~B
               // ptr refers to B, but is neither B nor its base
}
typeid如果操作数
typeid引用正在构造或销毁的对象,并且操作数的静态类型既不是构造函数或析构函数的类,也不是其基础之一,则行为是未定义的.
同样,如果操作数引用被破坏的对象,但某种程度上不是对象及其基础,则行为是未定义的.
void foo(A* a) {
    static auto ptr = a;
    typeid(*ptr);  // UB when called from ~B()
                   // ptr refers to B, but is neither B nor its base
}
dynamic_cast如果操作数
dynamic_cast指的是正在构造或销毁的对象,并且操作数的静态类型不是构造函数或析构函数自己的类或其基础的指针或对象,则dynamic_cast结果为未定义的行为.
同样的交易.
void foo(A* a) {
    static auto ptr = a;
    dynamic_cast<B*>(ptr); // UB when called from ~B()
                           // ptr refers to B, but is neither B nor its base
}
现在,如果你认为这是一场惨败并且不明白发生了什么,那就不要this在析构函数中传递任何东西.
所有引用来自http://eel.is/c++draft/class.cdtor
| 归档时间: | 
 | 
| 查看次数: | 608 次 | 
| 最近记录: |