c++动态内存管理

xiaoxiao2021-02-28  105

1.c的动态内存管理细节

malloc calloc realloc都可以动态内存开辟

malloc开辟不初始化,而calloc开辟初始化为0,且两者返回值地址都为起始地址,返回类型为void*,用free()释放。

realloc有两个参数<调整的空间起始地址,要调整的大小>,必须要接收返回值。

①拷贝释放原来的空间<要开辟的空间不足>

②直接加开辟的空间<开辟足>

2.c动态管理在c++中的缺陷引入c++动态内存管理

   malloc只是开辟空间,但空间没有初始化,存的是随机值。

1.malloc/free是库函数,new/delete是操作符。

2.malloc/free只动态表分配空间,而new/delete不仅分配空间还初始化变量。

3.malloc/free手动计算大小,返回类型void*,而new/delete自动计算大小。

4.malloc/free,new/delete都是动态内存管理入口。

3.C++动态内存管理基本语法和使用

操作符   

#include<iostream> using namespace std; int main() { int*p = new int;//初始化 *p = 20; delete p;//释放空间 int*p = new int[3];//数组的初始化 delete[]p; return 0;new:1.开辟空间 operator new开辟空间

          2.调用构造函数,初始化空间

delete:1.调用析构函数

             2.释放空间

4.C++提供的动态内存管理的底层实现及其接口operator new/delete/new[]/delete[]

new:1.operator new()开辟空间

    2.调用构造函数初始化

delete:1.调用析构函数

     2.operator delete()释放空间

new[]:1.operator new[]()开辟空间

       2.调用构造函数初始化

delete[]:1.调用析构函数

   2.operator delete[]()释放空间

operator new/operator new[]底层都是对malloc()的封装,

operator delete/operator delete[]底层都是对free()的封装。

5.定位new表达式

    支持对已分配的函数创建对象。

new(place_address)type      //new(pa+i)A(i)

A*pa = (A*)malloc(10*sizeof(A)); int i = 0; for(i=0;i<10;i++) { new(pa+i)A(i);//定义一个数组,这个数组的每一个元素都是A类型的元素,用构造函数初始化数组空间 } for(i=0;i<10;i++) { pa[i].~A();//先调用析构函数,再由free()释放空间 } free(pa);

6.delete[]析构函数调用细节剖析

delete[]析构函数会根据数组的个数,分别调用析构函数,也就是,如果数组个数为10个,那么在释放空间的时候,

析构函数就会调用10次来进行释放。且delete底层实现是由free来释放的。

即operator delete[]---->operator delete--->free()

转载请注明原文地址: https://www.6miu.com/read-33942.html

最新回复(0)