构造函数中的字段初始化会破坏内存
问题描述:
对于来自UNIT测试的构造函数中的某些reasone字段初始化,会破坏内存。构造函数中的字段初始化会破坏内存
我有以下类
//.h
class Entity
{
public:
...
Entity();
private:
unsigned int _nextOperatorId;
unsigned int _operators[30][4]; //from consts
...
}
//.cpp
Entity::Entity() : _operators(), _nextOperatorId(1)
{
/* If i run this from unit test i see:
_operators [0] 0x0569bb38 {3452816845, 3452816845, 3452816845, 3452816845, 1}
_operators [1] 0x0569bb4c {3452816845, 0, 0, 0, 0}
_operators [2] 0x0569bb4c {0, 0, 0, 0, 0}
... (all other rows are zeroes).
If i delete _nextOperatorId(1) initialiazation, or if i run constructor from console app, here all as expected - all rows in operators array are zeroes */
}
我运行这个在VS单元测试类初始化是这样的:
private
Entity* entity;
public:
TEST_METHOD_INITIALIZE(ClassInitialize)
{
entity = new Entity();
}
那么,为什么内存corruypted后,我加入_nextOperatorId(1)?所有看起来这么简单..
答
在VC++编译器中有一个已知的bug;除非它在你的版本中修复,否则你不能依靠VC++来按照C++标准的要求来初始化你的类成员。
http://connect.microsoft.com/VisualStudio/feedback/details/564268/c-value-initialization
后一个完整的例子,编译。 – user657267 2014-08-29 08:25:48
我很想知道是否相同的问题与初始化列表顺序相反(即它与您班级中的decls匹配)。注意:它应该没关系;他们应该始终按照自上而下的decl顺序进行初始化,而不是初始化者列表顺序,但是我不会放过MS来放弃这个球。 – WhozCraig 2014-08-29 08:33:31