很多人在面试时都会被问malloc和new之间的不同,有些人会说一下。但很多人可能并没有真正的遇到过因其不同而带来的问题。
1 new会调用构造函数,malloc不会。
这句话的真正意思是,new会给struct的成员分配空间,而malloc其实则不一定。
struct Data {
string name;
int id;
};
struct Data* pData = (Data*) malloc(sizeof(Data));
if (pData == nullptr) {
return;
}
pData->name = "test"; // crash
Data* pData = new Data();
pData->name = "test"; // ok
2 假如你的结构体中有string,又有零长数组,你改如何做?
struct Data {
string name;
int id;
char data[0]; // zero array
};
struct Data* pData = (Data*) malloc(sizeof(Data));
if (pData == nullptr) {
return;
}
pData->name = "test"; // crash
Data* pData = new Data();
pData->name = "test"; // ok
char source[20] = {'h', 'a', ...};
memcpy(pData->data, source, 20); // crash.
new的问题在于,它没法给你的零长数组分配空间。除非你自己定义构造函数,但也不行。
因为零长数组中index 0,即data[0]是占位用的,你一开始不给它分配空间,后面就是左值,
无法再将其指向其它地址了。