面试题:new与malloc动态分配内存的区别与联系

C++中,动态分配内存常有两种方式,一是通过C语言中的malloc/free函数,二是c++本身的new/delete运算符。malloc和new之间有啥联系和区别呢,在编程中又该怎么使用呢,我们一起来看一下。

一、malloc与new介绍

malloc:C语言提供的库函数,用于在堆区中申请一块指定大小的内存,并返回指向内存首地址的无类型指针;
new:C++语言提供的运算符,由编译器在自由存储区自动分配对象应占的内存,并返回指向内存首地址的对象类型指针;

二、联系

 1、二者均是动态分配内存的方法,由程序员自动开辟和释放内存,需要malloc/free、new/delete成对使用;
 2、new是以malloc函数为底层来实现的;

三、区别

 1、malloc是C语言定义的库函数,而new是C++定义的运算符;
 2、malloc不能对类进行操作,而new可以自动调用类的构造函数和析构函数;
 3、malloc在堆区分配内存,而new在自由存储区分配内存,自由存储区可以是堆区也可以是静态存储区,通常是在堆区;
     [自由存储区和堆区的区别](https://blog.csdn.net/qq_21989927/article/details/107569303?utm_medium=distribute.pc_relevant.none-task-blog-title-3&spm=1001.2101.3001.4242)
 4、malloc必须由程序员指定分配内存的大小,而new由编译器自动计算指定类型的内存大小;
 5、malloc不能进行初始化,new可以进行初始化;
 6、malloc的返回类型是viod*指针(需要强转换为所需要的类型),而new的返回类型是对象类型的指针;
 7、malloc不能重载,而new可以重载operator new,可以指定内存分配的区域 ;

四、常见用法

1、malloc/free

malloc的函数原型为:void* malloc(size_t size);
free的函数原型为:void free(void* ptr);

一起看一下malloc/free的使用案例:

#include
using namespace std;

int main()
{
     
	int len=3;
	int* p = (int*)malloc(sizeof(int) * len); //分配3个int元素数组的内存

	p[0] = 10;  //初始化数组的第一个元素
	p[1] = 20;  //初始化数组的第二个元素
	p[2] = 30;  //初始化数组的第三个元素

	for (int j = 0; j < len; j++)
	{
     
		cout << p[j] << endl;
	}
	free(p); //释放p指向的内存
	p=NULL ; //将指针p置为置为空指针,避免误用

	system("pause");
	return 0;
}

输出结果为三个元素的初始值10、20、30,释放p指向的内存后,若再次调用p就会出现内存错误,证明p指向的内存已经被释放。
注意:malloc/free一定要配套使用,以免造成内存泄露

2、new/delete

new对一个变量或自定义类分配内存的用法: A *p=new A;
                         释放内存:delete A;
new对一个数组分配内存的用法:B *p=new B[];
                释放内存:delete[] B;
一起看一下new对数组进行操作的方法:
#include
using namespace std;

int main()
{
     
	int len = 3;
	int* p = new int[3]; //分配3个int元素的内存

	p[0] = 10;
	p[1] = 20;
	p[2] = 30;

	for (int j = 0; j < len; j++)
	{
     
		cout << p[j] << endl;
	}
	delete[] p; //释放p指向的内存
	P=NULL;  //将指针p置为置为空指针,避免误用
	
	system("pause");
	return 0;
}

输出结果为数组三个元素的初始值10、20、30。
同理,new/delete、new[]/delete[]也要配套使用,避免内存泄露。

五、常见的问题

为啥释放了指针p的内存之后,还要将指针p置为空指针?
答:不管是free函数还是delete运算符,都只是释放了指针p指向的内存,指针p还存在并存放着原有的地址。但是内存被系统回收之后,该地址存放的就是垃圾内容,若p指针也就变成了野指针。若后面程序不小心对指针p进行解引用,可能会造成难以想象的后果,因此在释放内存之后一定要将p置为空指针,以免程序后续发生错误。

你可能感兴趣的:(c++,指针,内存管理,数据结构)