malloc和new之间的不同-实战篇

26 篇文章 0 订阅
本文深入探讨了C++中malloc和new操作符在内存分配上的差异,特别是涉及到构造函数调用和零长数组的问题。new会自动调用构造函数初始化对象,而malloc则不会。在处理包含string和零长数组的结构体时,new能正确分配并初始化内存,避免了崩溃的风险,而malloc则可能导致不可预期的行为。理解这些差异对于避免内存管理错误至关重要。
摘要由CSDN通过智能技术生成

很多人在面试时都会被问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]是占位用的,你一开始不给它分配空间,后面就是左值,

无法再将其指向其它地址了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值