比如以下的类,我要新建一个Stuff数组:
Class Stuff{
Public:
int i;
Stuff(){
cout<<"正在执行构造函数"<<endl;
i = 9810;
}
};
//A
Stuff *A = new Stuff[size];
//B
//由于malloc默认返回的是void*的类型,所以要进行类型转换
//C++里面使用static_cast<Class>进行类型转换
Stuff *B = static_cast<Stuff*>(malloc(size * sizeof(Stuff)));
如果调用A的话,我们会看到打印出来的“正在执行构造函数”
,有size个,因为初始化size个Stuff对象,每个都执行一次打印。
而且查询i的话,i的值也是9810,说明i = 9810;
被执行了。
如果调用B的话,我们不会看到打印信息,查询i的话,得到的也是0。因为malloc只会单纯给你分配内存,它不会执行类其中的构造函数等初始化工具。
对于string、vector等类,如果你的构造函数没有正确执行,你初始化得到的可能是一堆奇奇怪怪的值。所以大多数情况下,都使用new,不要用malloc,除非你真的明白你在做什么。
不过,话说回来,其实new是先调用operator new,再调用构造函数的。而operator new函数,里面用的其实也是malloc,所以其实包含了。