ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

C++ new 和 malloc 的区别

2021-11-21 12:00:44  阅读:125  来源: 互联网

标签:malloc int C++ 操作符 内存 operator new


C++ new 和 malloc 的区别

1.内存位置

new操作符从自由存储区(free store)上为对象动态分配内存空间,而malloc函数从堆上动态分配内存。自由存储区是C++基于new操作符的一个抽象概念,凡是通过new操作符进行内存申请,该内存即为自由存储区。而堆是操作系统中的术语,是操作系统所维护的一块特殊内存,用于程序的内存动态分配,C语言使用malloc从堆上分配内存,使用free释放已分配的对应内存。

那么自由存储区是否能够是堆(问题等价于new是否能在堆上动态分配内存),这取决于operator new 的实现细节。自由存储区不仅可以是堆,还可以是静态存储区,这都看operator new在哪里为对象分配内存。

2.返回类型

new操作符内存分配成功时,返回的是对象类型的指针,类型严格与对象匹配,无须进行类型转换,故new是符合类型安全性的操作符。

3.分配失败处理

new内存分配失败时,会抛出bac_alloc异常,它不会返回NULL;malloc分配内存失败时返回NULL。

4.调用构造函数

使用new操作符来分配对象内存时会经历三个步骤:

第一步:调用operator new 函数(对于数组是operator new[])分配一块足够大的,原始的,未命名的内存空间以便存储特定类型的对象。
第二步:编译器运行相应的构造函数以构造对象,并为其传入初值。
第三部:对象构造完成后,返回一个指向该对象的指针。

5.调用析构函数

使用delete操作符来释放对象内存时会经历两个步骤:

第一步:调用对象的析构函数。
第二步:编译器调用operator delete(或operator delete[])函数释放内存空间。

综合实践

代码

#include <iostream>
#include <cstdlib>
#include <limits.h>

#define N 10
using namespace std;

int main()
{
	// 区别1. malloc 必须强制转换指针类型, 而 new 不用
	int * p = (int *)malloc(N * sizeof(int));
	int * q = new int[N];
	delete [] q;
	free(p);
	
	// 区别2. 对于类的对象,new 会调用默认构造函数,而 malloc 只是单纯分配空间
	class Car
	{
	public:
		Car(){cout << "Car()" << endl;}
		~Car(){cout << "~Car()" << endl;}
		virtual int p(){cout << "virtual p()" << endl;}
	private:
		int price;
	};

	Car * car_p = (Car *)malloc(sizeof(Car));
	Car * car_q = new Car;

	cout << "sizeof(Car)=" << sizeof(Car) << endl;//应该是 8, 因为一个 int 4 字节,还有一个虚函数表指针 4 字节

	// 区别3. 对于类的对象,delete 会调用析构函数,而 free 只是单纯释放空间
	delete car_q;
	free(car_p);

	// 区别4. 对分配内存出现错误时,new 会抛出 bac_alloc 异常, malloc 会返回 NULL
	p = (int *)malloc(INT_MAX);
	if (!p)
		cout << "malloc failed" << endl;
	free(p);
	q = new int[INT_MAX];
	delete []q;
} 

运行截图

image-20211121113502807

标签:malloc,int,C++,操作符,内存,operator,new
来源: https://www.cnblogs.com/studentWangqy/p/15583979.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有