☰
  • 首页
  • 规则分类
  • 项目介绍
search
•••

将对象指针转为其基类对象的指针时,基类对象尚未开始构造或已结束析构

C++-Undefined-Behavior-62
目录 › next › previous

示例:

struct A {
    ....
};

struct B: A {
    B();
    B(A*);
};

struct C: B {
    C(): B(this) {     // Undefined behavior
    }
};

例中将 C 的 this 指针作为基类 B 构造函数的参数,相当于将 C* 转为 A*,而这时基类 B 和 A 均未开始构造,会导致未定义的行为。

又如(各项声明接上例):

struct X {
    X(A*);
};

struct D: B, X {
    D(): B(), X(this) {  // OK
    }
};

将 D 的 this 指针作为基类 X 构造函数的参数,相当于将 D* 转为 A*,这时 B 的构造函数已经执行完毕,所以这种情况没有问题。

依据

ISO/IEC 14882:2003 12.7(2)-undefined ISO/IEC 14882:2011 12.7(3)-undefined
Copyright©2024 360 Security Technology Inc., Licensed under the Apache-2.0 license.