主要参考:https://blog.csdn.net/stpeace/article/details/41663381 //malloc和string相遇出错
https://blog.csdn.net/nie19940803/article/details/76358673//malloc和new分配内存的区别
今天在研究链表的时候,发现有个小问题总是报错,是关于结构体中string和mllloc相遇的问题
之前已经遇到过,所以把它记录下来。
经过试验,我发现只要结构体中不存在string类型的变量
malloc就能正常使用
例如:
struct test
{
int data;
};
int main()
{
test* t = (test *)malloc(sizeof(test));
t->data = 18;
cout << t->data << endl;
return 0;
}
此时能正常运行,运行结果:
一旦加入string类型变量:
struct test
{
int data;
string name;
};
int main()
{
test* t = (test *)malloc(sizeof(test));
t->data = 18;
t->name = "Lisa";
cout << t->data <<t->name<< endl;
return 0;
}
无法正常编译
0xCDCDCDCD | 堆上分配的地址,但是没有初始化 |
原来malloc和string是有冲突的,这是因为malloc/free和new/delete的重要区别之一是:
new会先调用operator new函数,申请足够的内存(通常底层使用malloc实现)。然后调用类型的构造函数,初始化成员变量,最后返回自定义类型指针。delete先调用析构函数,然后调用operator delete函数释放内存(通常底层使用free实现)。
malloc/free是库函数,只能动态的申请和释放内存,无法强制要求其做自定义类型对象构造和析构工作。
所以string的构造函数并没有被调用,name没有被初始化,改为new能正常运行。
struct test
{
int data;
string name;
};
int main()
{
test* t = new test;
t->data = 18;
t->name = "Lisa";
cout << t->data <<'\t'<<t->name<< endl;
delete t;
return 0;
}
结果: