【问题标题】:Do classes with uninitialized pointers have undefined behavior?具有未初始化指针的类是否具有未定义的行为?
【发布时间】:2010-08-06 17:32:21
【问题描述】:
class someClass
{
public:
    int* ptr2Int;
};

这是一个有效的类吗(是的,它可以编译)?如果在取消引用之前为 ptr2Int 分配了一个值,那么该类是否可以保证按预期工作?

【问题讨论】:

  • 您是否希望任何人保证代码会按预期运行,但不知道会发生什么? :)

标签: c++ pointers initialization standards unsafe-pointers


【解决方案1】:

类中未初始化的指针与独立的未初始化指针没有任何不同。只要您不以任何危险的方式使用指针,就可以了。

请记住,尽管使用未初始化指针的“危险方式”包括仅尝试读取其值(无需取消引用)。如果您在为指针分配有效值之前使用这些隐式成员函数,则类中存在的隐式编译器提供的复制构造函数和复制赋值运算符可能会执行此类尝试。

实际上,如果我没记错的话,这个问题是标准化委员会层面的一些讨论问题。是否允许隐式生成的成员函数跳过类的未初始化成员中可能存在的陷阱表示?我不记得是什么判决了。 (或者我在 C99 的上下文中看到了那个讨论?)

【讨论】:

  • @Omnifarious:因为它可能包含一个所谓的 trap 表示,例如,它可能会在仅仅尝试读取它时使程序崩溃。事实上,读取一个普通的未初始化的int 可以导致同样的事情。但是使用int 需要一个相当奇特的平台。有了指针,陷阱就更真实了,因为一些硬件平台使用专用的地址寄存器来处理指针。这些寄存器可能会“即时”执行指针有效性检查。 IE。只是将值加载到寄存器中会导致陷阱。无需取消引用。
  • @Omnifarious:当然,更简短的回答是:因为语言规范明确规定读取 any 类型的未初始化值(unsigned char 除外)通常会导致到未定义的行为。
【解决方案2】:

是的,没关系。指针本身存在,只是它的值是未知的,所以取消引用它是不安全的。有一个未初始化的变量是完全可以的,指针也没有什么不同

【讨论】:

    【解决方案3】:

    是的,这与带有单个未初始化指针的struct 完全相同,并且两者都保证可以正常工作(当然,只要您在使用它之前设置指针)。

    【讨论】:

      【解决方案4】:

      在你取消引用指针之前一切都很好,然后它是未定义的领域。

      根据您是在调试模式还是发布模式下编译,某些编译器会将指针设置为默认值(如 null)。所以事情可以在一种模式下工作,突然间一切都在另一种模式下分崩离析。

      【讨论】:

        猜你喜欢
        • 2011-05-16
        • 2018-11-05
        • 2015-04-19
        • 1970-01-01
        • 2010-11-23
        • 1970-01-01
        • 1970-01-01
        • 2021-08-30
        • 1970-01-01
        相关资源
        最近更新 更多