c++链表/结构体中含有string类型使用malloc分配内存失败/报错

今天在写链表的时候,心血来潮使用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开辟内存。

纯小白,有错请斧正。

  • 8
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Phenylalanine_苯丙氨酸

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值