在普通C中,在实例化后重置结构是很常见的:
struct MyClass obj;
memset( &obj, 0, sizeof(struct MyClass) );
这很方便 - 尤其是在使用面向对象的范例时,因为无论随着时间的推移添加了多少成员,所有成员都可以保证重置为null等。
我正在寻找一种在C ++中做同样事情的方法。显然你不能简单地重置内存,因为vtable是它的一部分。另外,在我的特定情况下,我不能使用模板。
我看到的一个解决方案是使用所有成员声明一个结构,然后您可以一次性重置:
class MyClass{
MyClass(){ memset(&m, 0, sizeof(m)); }
struct{
int member;
} m;
};
但我不太喜欢这个解决方案。
我猜“黑客”是可用的,如果你知道一个,请说一下使用它的风险,例如:如果它可以在编译器等之间有所不同。
由于
答案 0 :(得分:2)
如果您想确保使用零分配内存块,可以使用放置新操作符:
size_t sz = sizeof(MyClass);
char *buf = new char[sz];
memset(buf, 0, sz);
MyClass* instance = new (buf) MyClass;
答案 1 :(得分:0)
不要成为一个spoilsport,但为什么不简单地为需要定义值的成员添加一个初始化列表,让对象有效,让编译器找出初始化对象的理想方法。 / p>
根据对象的类型,这可以节省相当多的代码大小和/或时间,而且即使某个类型的“空”表示不是全零也是安全的。例如,一旦NULL指针为0x02000000,并且使用该值在整数和指针XOR之间进行转换,我已经攻击了编译器;然后,您的程序会将任何指针成员初始化为非NULL值。