具有未初始化指针的类是否具有未定义的行为?

时间:2010-08-06 17:32:22

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

class someClass
{
public:
    int* ptr2Int;
};

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

4 个答案:

答案 0 :(得分:5)

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

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

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

答案 1 :(得分:1)

是的,没关系。指针本身存在,只是它的值是未知的,因此解除引用它是不安全的。拥有一个未初始化的变量是完全没问题的,指针也没有任何不同

答案 2 :(得分:1)

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

答案 3 :(得分:-1)

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

某些编译器会将指针设置为默认值(如null),具体取决于您是在调试模式还是在发布模式下编译。所以事情可以在一种模式下起作用,突然间一切都在另一种模式中崩溃。