2010-08-06 64 views
1
class someClass 
{ 
public: 
    int* ptr2Int; 
}; 

这是一个有效的类(是的,它编译)?假如在解引用它之前给ptr2Int赋值,那么该类是否可以保证按照预期工作?有未初始化指针的类有未定义的行为吗?

+0

您是否期望任何人提供保证,即代码会像人们预期的那样行事,不知道人们会期待什么? :) – 2010-08-06 17:37:27

回答

5

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

请记住,使用未初始化指针的“危险方式”仅仅是尝试读取其值(不需要取消引用)。如果在指针指定有效值之前使用这些隐式成员函数,则类中存在的隐式编译器提供的复制构造函数和复制赋值运算符可能会执行此类尝试。其实,如果我没有弄错,这个问题是标准化委员会层面讨论的问题。是否允许隐式生成的成员函数跳过可能存在于非初始化类成员中的陷阱表示?我不记得是什么结论。 (或者,也许我在C99的背景下看到了这种讨论?)

+0

为什么简单地读一个未初始化的指针'危险'? – Omnifarious 2010-08-06 18:18:56

+0

@Omnifarious:因为它可能包含所谓的*陷阱表示*,例如,它可能会使程序崩溃,仅仅尝试读取它。实际上,读一个普通的未初始化的'int'可以产生相同的结果。但是用'int'它需要一个相当异乎寻常的平台。有了指针,陷阱就更加真实了,因为一些硬件平台使用专用的*地址寄存器*来处理指针。这些寄存器可能会“实时”执行指针有效性检查。即只是将值加载到寄存器中会导致陷阱。没有必要的解除引用。 – AnT 2010-08-06 18:38:02

+0

@Omnifarious:当然,较短的答案是:因为语言规范明确指出,读取* any *类型的未初始化值(“unsigned char”除外)通常会导致未定义的行为。 – AnT 2010-08-06 18:40:25

1

是的,没关系。指针本身存在,只是它的值是未知的,所以解引用它是不安全的。有一个未初始化的变量是非常好的,指针没有任何不同

1

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

-1

直到你取消引用指针它都是好的,那么它是未定义的领土。

某些编译器会根据您在调试模式或发布模式下进行编译来设置指向默认值的指针(如null)。所以事情可以在一种模式下工作,突然之间一切都会崩溃。

+0

读取它的值也是UB – qdii 2014-11-05 11:48:54