C/C++动态内存管理及malloc与new区别详解

1、malloc 函数

void *malloc(unsigned int size);

在内存的动态存储区中分配一个长度为size的连续空间
成功返回所申请空间的起始地址
失败返回NULL
常使用sizeof()运算符判断所需要空间大小
2、free 函数

`void free(void *p)`;

释放指针 p 所指向的动态空间的地址。
p 是调用 malloc 函数时的返回的地址。
free函数无返回值。
3,、new “函数”

new和delete是运算符,不是函数,因此执行效率高。
使用形式:
指针变量 = new类型(常量);
指针变量 = new类型[表达式];
作用:
从堆分配一块“类型”大小的存储空间,
返回首地址。
其中:常量是初始化值,可省略。
创建数组对象时,不能为对象指定初始值。
如果由于内存不足等原因而无法正常分配空间,则new会返回一个空指针NULL
4、delete 运算符
使用形式:
delete 指针变量;
delete []指针变量;
注意:
正常情况new一个数组之后,用delete释放是没有问题的。但是当对new得到的堆区进行越界的写入操作(读操作不会)将会导致delete时出现段错误,无法进行删除。
比如
char* strcpy(char* dest, char* src);
这个函数是从src地址开始且含有’\0’结束符的字符串复制到以dest开始的地址空间,返回dest的指针。如果dest指向的内存没有足够大小去存放src字符串 strcpy函数没有越界检测机制,他依然会继续越界写入。将会导致错误。

5、malloc与new区别

1、new分配内存按照数据类型进行分配,malloc分配内存按照指定的大小分配;
2、new返回的是指定对象的指针,而malloc返回的是void*,因此malloc的返回值一般都需要进行类型转化。

3、new不仅分配一段内存,而且会调用构造函数,malloc不会。

4、new分配的内存要用delete销毁,malloc要用free来销毁;delete销毁的时候会调用对象的析构函数,而free则不会。

5、new是一个操作符可以重载,malloc是一个库函数

6、malloc分配的内存不够的时候,可以用realloc扩容。扩容的原理?new没用这样操作。

7、new如果分配失败了会抛出bad_malloc的异常,而malloc失败了会返回NULL。

8、申请数组时: new[]一次分配所有内存,多次调用构造函数,搭配使用delete[],delete[]多次调用析构函数,销毁数组中的每个对象。而malloc则只能sizeof(int) * n。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值