Visual Studio C++ 编译器在局部变量对象上的奇怪行为

Posted

技术标签:

【中文标题】Visual Studio C++ 编译器在局部变量对象上的奇怪行为【英文标题】:Visual Studio C++ Compiler strange behavior, on Local variable objects 【发布时间】:2017-01-23 11:06:50 【问题描述】:

我对 C++ 编程和编程本身还比较陌生,并且我试图建立对 C++ 代码的 Visual Studio 编译器的预期行为的熟悉程度。 (Visual Studio 2015)

class aClass 

   public:
     int a;
     int b;

然后在一个功能块里面,当我声明这个类的一个对象时:

aClass obj;
cout << obj.a;

然后我确实有一次将随机 RAM 内容作为变量的值,而其他时候我得到编译错误:局部变量未初始化。 (值得注意的是,每当编译器克服一次错误时,它就不会再重复它,尽管它可能会在第一次克服错误之前一直重复多次!)

关于声明对象的最佳实践的任何建议,

我是否应该坚持使用 aClass obj = aClass(); 的形式以获得一致的结果。

或任何相关的意见。提前致谢。

【问题讨论】:

您的类缺少用于初始化成员变量的构造函数。 默认情况下不初始化具有运行时生命周期的变量。 而其他时候我得到编译错误:局部变量未初始化如果我没记错的话 - 这是一个警告,而不是一个错误。 【参考方案1】:

当你从一个类或一个结构中声明一个变量时,对象就会被构造出来,但里面的数据不会自动初始化。由您来初始化数据。

没有初始化的成员变量的值将是不确定的,并且以任何方式使用它们(甚至从它们中读取)都是未定义的行为

根据类或结构,初始化数据的方式不同。如果您定义了构造函数,那么我建议您使用构造函数初始值设定项列表。如果你有一个 POD 类型的结构(就像你在代码中显示的那样),你可以简单地做类似的事情

aClass obj = ;  // Basically the same as `aClass obj = aClass()`

【讨论】:

感谢您的回答,顺便说一下,当我在类中显式声明默认构造函数时,声明的任何对象都将由我的默认构造函数初始化,这对于自动默认构造函数而言并非如此,因此是我的问题背后的原因。这根本不是一个愚蠢的问题,而是当我提供默认构造函数与编译器提供它时,默认构造函数的行为似乎有所不同。像往常一样,匆忙阅读的人会给出错误的答案,这意味着对问题提出者“缺乏足够的意识”的回应。不包括这个答案。谢谢 @Physician 一个小小的说明:如果你定义了一个构造函数,那么仅靠它来初始化成员变量是不够的,你需要显式地初始化它们(除非它们反过来有一个构造函数来初始化它自己的成员)。 是的,毫无疑问,我会将其视为宝贵的建议。但实际上,当类类型具有显式的默认构造函数时,单独编写语句 (( 类型标识符; )),没有任何显式初始化程序永远不会导致编译器认为对象“未初始化”,从字面上看。跨度> 【参考方案2】:

关于声明对象的最佳实践的任何建议

是的, 调用未定义的行为怎么样?您正在读取未初始化的变量;有时编译器会检测到它,有时它不会,你会看到垃圾出来了。

你如何处理这个问题? 在读取之前初始化你的变量!

【讨论】:

以上是关于Visual Studio C++ 编译器在局部变量对象上的奇怪行为的主要内容,如果未能解决你的问题,请参考以下文章

如何只用visual c++编译器而不安装visual studio

如何在visual studio2008中创建,编译和运行C++程序,

如何在Visual Studio中检查函数末尾的变量值

Visual Studio 2005 C++ 编译器比 Visual Studio 6 编译器慢?

Visual Studio 2010 像 Visual Studio 6 一样在 C++ 中编译内联程序集?

我可以在 Visual Studio 2008 中使用 Visual Studio 6 编译的 C++ 静态库吗?