为什么默认参数在发布中没有完全初始化?(调试与发布)
Why aren't default parameters fully initialized in Release? (Debug vs. Release)
只是为了给我一些背景。我是一位经验丰富的 C# 开发人员,正在切换到 C++ 项目。我在职业生涯早期做了多年的 c++,但有点生疏......话虽如此。这是我能想出的最简单的例子来展示我的问题:
#include <vector>
#include <iostream>
using namespace std;
struct Inner
{
public:
float A;
unsigned short B;
Inner()
:A(0.0F), B(0)
{
}
Inner(const float& valA, const unsigned short& valB)
: A(valA), B(valB){}
};
class Outer
{
private:
const vector<Inner> CollectionOfInner;
public:
Outer(const vector<Inner> initialVal = { Inner(1.0F, 4), Inner(9.0F, 4), Inner(81.0F, 18) })
: CollectionOfInner(initialVal)
{
cout << "Values" << 'n';
for (int i = 0; i < 3; i++)
{
cout << "A: " << CollectionOfInner[i].A << " B: " << CollectionOfInner[i].B << 'n';
}
}
};
int main()
{
Outer test;
}
我的程序只是依靠上面显示的默认参数创建 Outer 的堆栈实例。在调试中,一切都按预期工作,给出以下输出:
Values
A: 1 B: 4
A: 9 B: 4
A: 81 B: 18
Press any key to continue . . .
但是,在发布配置中,只有三个内部实例中的第一个正确初始化,输出如下:
Values
A: 1 B: 4
A: 4.59009e-039 B: 4138
A: 2.64788e-038 B: 52345
Press any key to continue . . .
我敢肯定这与发布中打开的一些优化有关......但对于我的生活,我无法想象你为什么会想要这种行为......起初,我以为在我的大型项目中只是在进行某种内存破坏,但是一旦我用这样一个简单的项目确认了"错误",我就知道发生了更基本的事情。注意:如果我向外部构造函数提供预先创建的向量,一切都很好。仅当依赖默认构造函数时,才会出现问题。有什么想法吗?此外,作为参考,这是在 Visual Studio 2013 中使用标准C++控制台应用程序项目模板完成的。
共识似乎是Visual Studio 2013中的一个错误。自己回答这个问题来解决问题。谢谢大家!
相关文章:
- 是否可以初始化不可复制类型的成员变量(或基类)
- C++使用整数的压缩数组初始化对象
- C++初始化基类
- 多成员Constexpr结构初始化
- 复制列表初始化的隐式转换的等级是多少
- 内联映射初始化的动态atexit析构函数崩溃
- 如何在C++中初始化嵌套类中的2个memeber
- 如何声明特征矩阵,然后通过嵌套循环初始化它
- 没有用于初始化C++中的变量模板的匹配构造函数
- 在未初始化映射的情况下,将值插入到映射的映射中
- C++成员初始化
- 在类声明中初始化 const 成员变量时在调试模式下出现异常
- Visual Studio,找不到初始化术语,无法再调试
- Linux Opensuse C 编译器问题.(无法初始化部分调试器的解压缩状态)
- 调试断言因通过用户输入初始化类的数组而失败
- 用C++中的nan初始化内存进行调试
- 由于头文件中无符号整型初始化,调试模式链接失败
- 调试断言失败!表达式:is_block_type_valid(标头>_block_use)。对象不会初始化和推送错误
- 用于调试的未初始化内存的常用值是什么?
- 为什么默认参数在发布中没有完全初始化?(调试与发布)