#include <iostream>
struct A
{
A()
{
b = new char[10]();
}
int a;
char* b;
};
class T
{
public:
T()
{
memset(this, 0, sizeof(T));
}
~T() = default;
int geti() const { return i; }
const A& getA() const { return a; }
private:
int i;
A a;
};
int main()
{
T t;
std::cout << t.geti() << std::endl;
std::cout << t.getA().a << std::endl;
std::cout << t.getA().b << std::endl;
return 0;
}
执行memset时不会出现任何问题,成员变量a确实被清0了,但问题也在这里出现,我们会发现成员对象a中的指针b在执行memset之前指向一个地址,执行后被置为NULL了,这就导致在构造a时申请的数组不见了,我们就没办法析构new操作申请的数组,就造成了内存的泄露。
所以在构造函数中使用memset来初始化this是比较危险的,有可能会带来内存泄露,不建议这么使用,此外,memset可能会清空虚表指针。因此,没有virtual function,没有vtable,同时class当中没有包含其他class成员的class可以用这个。但是,即使一个类现在是POD,维护升级之后可能就不再是POD了。因此memset(this,0,sizeof(*this))是一种危险的写法,它限制了一个类再也不能改动,一旦改动,就会有问题出现。