今天在写链表的时候,心血来潮使用malloc来初始化结构体指针,类似下图:
#include<bits/stdc++.h>
using namespace std;
typedef struct LNode{
string data;
struct LNode * next;
}LinkList;//声明结构体
LinkList* createList(int len,LinkList *L){//创建链表
LinkList *head,*s,*tail;
head=L;
tail=head;
for(int i=0;i<len;i++){
s=(LinkList*)malloc(sizeof(LinkList));
cin>>s->data;
tail->next=s;
s->next=NULL;
tail=s;
}
}
void printList(LinkList *L){//打印链表
LinkList* r=L->next;
while(r){
cout<<r->data<<" ";
r=r->next;
}
}
int main(){
LinkList* L;
L=(LinkList*)malloc(sizeof(LinkList));//链表的初始化
L->next=NULL;
createList(5,L);
printList(L);
}
然后在输入第一个值后就异常退出,无法进行后续节点的创建:
百思不得其解,在多次调试以后,发现是因为结构体中使用了string类,只要将string换成其他的类型 如int 就可继续正常输入,或者将malloc换成new也可成功运行。
但是到底为什么???在查阅多番资料后,终于找到原因,首先我们来说说malloc与new的区别:
(1)malloc是c语言的标准库函数,需要头文件stdlib.h支持,malloc只能在堆上动态的为对象分配内存与释放内存,
而new是c++的操作符,通过调用operator new函数(底层使用malloc实现)在自由储存区来实现动态内存分配。
(2)malloc申请内存成功返回void*,malloc失败返回NULL;而new成功会返回对象类型指针,失败则会抛出异常。
(3)new开辟内存无需指定内存大小,而malloc需要指定字节数。
(4)new函数会调用该类型的构造方法,而malloc不会。
......
综上,new函数在调用operator new函数后会继续调用该类型的构造方法,紧接着返回该对象类型的指针,
而malloc仅开辟空间并返回void*。
我们知道string是一个常用的类,在为string分配空间时需要调用string的构造方法,而malloc无法调用,故程序会报错,而new拥有调用构造函数的功能,所以可以用new来为string开辟内存。
纯小白,有错请斧正。