new与delete C++

首先我们来看一下new和delete。

1)在C++中堆内存的分配和释放是通过new和delete来操作的,new的底层也是通过malloc来开辟内存的,new比malloc多一项功能,就是开辟完内存,还可以进行初始化操作,如下:

int *p = new int(10);

上面是new的基本操作,10代表堆上开辟的整形内存的初始值;如果是自定义类类型的话,如下:

Test *p = new Test();

这个语句不仅会在堆上开辟Test类型大小的一块内存,还会调用Test类的默认构造函数构造一个对象出来,这些都是malloc办不到的!

2)delete比free多一项功能就是在释放内存之前,还可以析构指针指向的对象,new和delete配对使用,new[]和delete[]配对使用,尽量不要交叉使用,以免产生不可预期的问题。

3)new开辟内存失败是抛出bad_alloc类型的异常,因此代码上要捕获该类型的异常才能正确的判断堆内存是否分配成功;malloc内存开辟失败返回的是NULL指针。

4)new和delete不仅仅是运算符,它们实际上是运算符重载函数的调用,对应的函数名是operator new和operator delete,可以在全局或者类的作用域中提供自定义的new和delete运算符的重载函数,以改变默认的malloc和free内存开辟释放行为,比如说实现内存池。

在C语言中,我们通常使用malloc/calloc/realloc/free进行动态内存分配,malloc/calloc/realloc是用来在堆上分配空间,free将申请的空间释放掉。

void Fun()
{
	int *p = (int*)malloc(10*sizeof(int));         //开辟10个int型的空间大小
    //int *p = (int*)calloc(10,sizeof(int));    //分配10个int型的内存块,并将其初始化为0
	if(p != NULL)
	{
		free(p);
		p = NULL;
	}
}

在堆上进行了多态内存开辟时一定要手动将它free,堆上分配的空间必须由用户自己来管理,如果不释放,就会造成内存泄漏。而栈上分配的空间是由编译器来管理的,具有函数作用域,出了函数作用域后系统会自动回收,不由用户管理,所以不用用户释放空间。

扫描二维码关注公众号,回复: 9145858 查看本文章

new和delete

new 和 delete 不是函数,它们都是 C++ 定义的关键字,通过特定的语法可以组成表达式。

string *ps = new string("hello world");
你就可以看出 new 和 malloc 还是有点不同的,malloc 申请完空间之后不会对内存进行必要的初始化,而 new 可以。所以 new e背后要做的事情不是你想象的那么简单。在用实例来解释 new 背后的机制之前,你首先需要知道 operator new 和 operator delete 是什么???

operator new 和 operator delete这两个其实是 C++ 语言标准库的库函数,原型分别如下:

void *operator new(size_t);     //allocate an object
void *operator delete(void *);    //free an object

void *operator new[](size_t);     //allocate an array
void *operator delete[](void *);    //free an array

总结new/delete和malloc/free的区别和联系:

1.  new和delete是C++关键字,需要编译器支持;malloc和free是库函数,需要头文件支持。

2.使用new操作符申请内存分配时无须指定内存块的大小,编译器会根据类型信息自行计算。而malloc则需要显式地指出所需内存的尺寸。

3. malloc/free只是动态分配内存空间/释放空间。而new/delete除了分配空间还会调用构造析构函数进行初始化与清理。

4. new操作符内存分配成功时,返回的是对象类型的指针,类型严格与对象匹配,无须进行类型转换,故new是符合类型安全性的操作符。而malloc内存分配成功则是返回void * ,需要通过强制类型转换将void*指针转换成我们需要的类型。

5.new/delete的底层调用了malloc/free。

6.malloc/free申请空间后得判空,new/delete则不需要。

7. C++允许重载new/delete操作符,malloc不允许重载。

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

发布了35 篇原创文章 · 获赞 13 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_41078889/article/details/90743345
今日推荐