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

C++ 具有未初始化指针的类是否具有未定义的行为?,c++,pointers,initialization,standards,unsafe-pointers,C++,Pointers,Initialization,Standards,Unsafe Pointers,这是一个有效的类(是的,它编译)?如果在取消引用之前为ptr2Int赋值,那么该类是否保证按预期工作?是的,可以。指针本身存在,只是它的值未知,所以取消引用它是不安全的。拥有一个未初始化的变量是很好的,指针也没有什么不同是的,很好。指针本身存在,只是它的值未知,所以取消引用它是不安全的。拥有一个未初始化的变量是非常好的,指针也没有任何不同是的,这与使用单个未初始化指针的结构完全相同,并且两者都保证工作正常(当然,只要在使用指针之前设置指针)。是的,这与使用单个未初始化指针的结构完全相同,并且两者

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

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

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

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

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

除非您取消引用指针,否则一切正常,那么它是未定义的区域


一些编译器会将指针设置为默认值(如null),具体取决于您是在调试模式还是发布模式下编译。因此,事情可能在一种模式下运行,然后突然在另一种模式下一切都崩溃了。

除非你取消对指针的引用,否则一切正常,那么它就是未定义的领域


一些编译器会将指针设置为默认值(如null),具体取决于您是在调试模式还是发布模式下编译。因此,事情可能在一种模式下运行,而突然间,一切都在另一种模式下崩溃。

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

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


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

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

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


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

您是否希望有人提供保证,保证代码会像预期的那样,不知道预期的结果?:)您是否希望有人提供保证,保证代码会像预期的那样运行,而不知道预期的是什么?:)@Omnifarious:因为它可能包含一个所谓的陷阱表示,例如,它可能会在仅仅试图读取它时使程序崩溃。事实上,读取一个普通的未初始化的
int
也会产生同样的结果。但如果使用
int
,则需要一个相当奇特的平台。对于指针,陷阱更真实,因为一些硬件平台使用专用地址寄存器来处理指针。这些寄存器可以“动态”执行指针有效性检查。即,仅将值加载到寄存器中会导致陷阱。无需取消引用。@Omnifarious:当然,较短的答案是:因为语言规范明确规定,读取任何类型的未初始化值(除了
无符号字符
)通常会导致未定义的行为。@Omnifarious:因为它可能包含所谓的陷阱表示,可能,例如,仅在试图读取程序时就将其崩溃。事实上,读取一个普通的未初始化的
int
也会产生同样的结果。但如果使用
int
,则需要一个相当奇特的平台。对于指针,陷阱更真实,因为一些硬件平台使用专用地址寄存器来处理指针。这些寄存器可以“动态”执行指针有效性检查。即,仅将值加载到寄存器中会导致陷阱。无需取消引用。@Omnifarious:当然,简短的回答是:因为语言规范明确规定,读取任何类型的未初始化值(除了
无符号字符
)通常会导致未定义的行为。
class someClass
{
public:
    int* ptr2Int;
};