昨天我读了一位同事的一些代码,发现了这一点:
class a_class
{
public:
a_class() {...}
int some_method(int some_param) {...}
int value_1;
int value_2;
float value_3;
std::vector<some_other_class*> even_more_values;
/* and so on */
}
a_class a_instances[10];
void some_function()
{
do_stuff();
do_more_stuff();
memset(a_instances, 0, 10 * sizeof(a_class)); // <===== WTF?
}
这合法吗(WTF 线,不是公共属性)?对我来说,味道实在是太难闻了……
该代码在使用 VC8 编译时运行良好,但在使用 VC9 编译时调用时会抛出“意外异常”a_instances[0].event_more_values.push_back(whatever)
,但是当访问任何其他成员时。有什么见解吗?
编辑:更改了memsetmemset(&a_instances...
to memset(a_instances...
。感谢爱德华指出这一点。
EDIT2:删除了 ctor 的返回类型。谢谢。
结论:谢谢各位,你们证实了我的怀疑。
这是一种广泛接受的 C 结构体初始化方法。
在 C++ 中它当然不起作用,因为你不能假设任何关于vector
的内部结构。将其清零很可能会使其处于非法状态,这就是程序崩溃的原因。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)