c++动态内存管理

来源:互联网 发布:淘宝合并购物车 编辑:程序博客网 时间:2024/05/14 17:06


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

malloc callocrealloc都可以动态内存开辟

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()