C++中的内存分配

C++中的内存分配

C++内存分配的三种方式

1. 从静态存储区分配:

此时的内存在程序编译的时候已经分配好,并且在程序的整个运行期间都存在。全局变量,static变量等在此存储。

2. 在栈区分配:

相关代码执行时创建,执行结束时被自动释放。局部变量在此存储。栈内存分配运算内置于处理器的指令集中,效率高,但容量有限。

3. 在堆区分配:

动态分配内存。用new/malloc时开辟,delete/free时释放。生存期由用户指定,灵活。但有内存泄露等问题。

动态分配内存

C++中通过new运算符进行动态内存申请

C++中的动态内存分配是基于类型进行的

malloc函数也可以用于指定大小的内存分配


new分配内存对应着delete释放内存

malloc分配内存对应着free释放内存


malloc和new的区别

1.申请内存的位置

new操作符是从自由分配区上为对象分配内存空间的,而malloc是在堆上分配内存的

自由分配区:是由操作符new决定的,可能是静态存储区,也可能是堆,定位new甚至可以不为对象分配内存

2.返回的类型

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

而malloc内存分配成功则是返回void * ,需要通过强制类型转换将void*指针转换成我们需要的类型。

类型安全很大程度上可以等价于内存安全,类型安全的代码不会试图方法自己没被授权的内存区域。关于C++的类型安全性可说的又有很多了。

3.内存分配失败时的返回值

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

4.是否需要指定大小

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

5.是否调用构造/析构函数

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

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

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

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

总之来说,new/delete会调用对象的构造函数/析构函数以完成对象的构造/析构。而malloc则不会。

猜你喜欢

转载自www.cnblogs.com/buerdepepeqi/p/12459119.html