为什么在Release中没有完全初始化默认参数? (调试与发布)

时间:2015-06-15 21:31:18

标签: c++ visual-studio-2013 default-parameters

给我一​​些背景知识。我是一位经验丰富的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 . . .

但是,在Release配置中,只有三个Inner实例中的第一个被正确初始化,输出如下:

Values
A: 1 B: 4
A: 4.59009e-039 B: 4138
A: 2.64788e-038 B: 52345
Press any key to continue . . .

我确定这与发布中启用的某些优化有关...但对于我的生活,我无法想象为什么你会想要这种行为......首先,我认为在我的大型项目中只会出现某种记忆混乱,但一旦我确认了#34; bug&#34;有了像这样简单的污垢项目,我知道一些更基本的事情正在发生。注意:如果我向Outer构造函数提供预先创建的向量,一切都很好。只有在依赖默认构造函数时才会出现此问题。有任何想法吗?另外,作为参考,这是使用标准C ++控制台应用程序项目模板在Visual Studio 2013中完成的。

1 个答案:

答案 0 :(得分:1)

共识似乎是Visual Studio 2013中的一个错误。我自己回答这个问题来解决问题。感谢大家!