"随机"来自确定的C ++程序的输出。可能的原因?

时间:2016-01-16 11:31:15

标签: c++ c++11 visual-c++

我在64位Windows PC上使用Microsoft Visual Studio Community 2015,版本14.xxx。

程序读取一个文本文件,其中每一行都是Bridge交易(四个玩家各有13张牌)。该文件由可靠的第三方程序生成,但我仍然验证每笔交易,每条输入行都通过验证。

然后我分组"类似"基于诸如点数,套装长度等变量一起处理类(bin)。这是使用stringstreams和我的Bin结构的映射的标准文本处理。它对于给定的输入文件是完全确定的。

大约3/4的时间我得到相同的输出,例如23个可能的箱子 - 如预期的那样,各个箱子之间的交易频率加起来就是投入交易的数量。但剩下的输出可能有6到50个箱子(正确的频率总和)。

这种随机性可能出现在哪里?我使用所有变量的默认初始化,所以,即使这是错误的,它应该在给定文件的程序运行中保持一致。例如,

std::string line;  //  Raw data on a deal.
std::vector<std::string> parsed_deal;
std::map<std::string, struct Bin> m_bin;
std::stringstream ss_bin[MAX_BINS]; 

1 个答案:

答案 0 :(得分:1)

默认初始化并不意味着每次运行程序时,所有变量都将以完全相同的方式初始化。特别是,默认初始化意味着在几种情况下未初始化。示例包括未初始化的基本类型(intfloat,指针,数组等等)(例如auto未初始化为零的变量),以及类的成员实际上没有由构造函数初始化的类型。访问未初始化变量的值(更不用说如果它是指针则取消引用它)会产生未定义的行为。

当然,存在未定义行为的其他原因(从数组末尾掉落,骚扰指针,在同一指针上调用操作符delete两次,在返回的指针上调用操作符delete malloc())。

如果行为未定义,那么&#34;非确定性&#34;行为是一种可能的结果。例如,当定义变量但未初始化变量时,其值可以基于先前在该物理/逻辑存储器位置中发生的任何事件。因此,访问其值的结果将取决于其他代码(在您的程序中,在您的操作系统中,甚至在另一个进程中)以前使用该内存,以及在您的程序访问它之前如何/如果该内存被覆盖。