C/C++内存管理

一、程序内存区域划分

C/C++内存管理_第1张图片

二、malloc、calloc、realloc的比较

1.相同点 

  1)返回值:成功:返回地址空间

                    失败:NULL

  2)使用之前都要进行判断是否为空

  3) 释放空间的方式:free 

  4) 返回值:void* (可以强制类型转换)

2.不同点

 1)  malloc 参数:(字节数)  功能:负责将空间给出

 2)calloc 参数:(单个元素字节数,元素个数)  功能:给出空间,且对空间进行初始化为0

 3) realloc 参数:(地址p, 字节数newsize) 功能:将p所在的内存大小(oldsize)调整到newsize大小。

      若p为NULL,则realloc功能和malloc相同。

      若p不为NULL:

                 C/C++内存管理_第2张图片

   三、C++内存管理方式

    1、C++管理内存的例子

C/C++内存管理_第3张图片

 2.总结:

   new 做了两件事:1)调用operator new 分配空间

                                 2)调用构造函数初始化对象

   delete也做了两件事:1)调用析构函数清理对象

                                      2)调用operator delete 释放空间

   new [N] :1) 调用operator new 分配空间

                   2) 调用N次构造函数初始化每个对象 

    delete [N]: 1)调用N次析构函数清理对象 (栈序,倒着销毁)(4中给出N的由来,请看下面)

                       2) 调用operator delete 释放空间 (空间起始位置进行free)

                       编译器在new出的数组对象头指针向前4个字节中记录了对象的数目(4个字节对应一个int值)

  注意:new和delete、new[ ]和delete[ ] 一定要匹配使用!!!

              malloc  /  free 在C++中也是可以使用的,只是malloc和free在C++中不能分别调用构造函数和析构函数来初始化对象和释放对象

   3.不同的类型内存泄漏问题

     对于内置对象,如果没有匹配释放,不会造成内存泄漏。

     对于自定义类型(class,struct)且析构函数显式给出的情况:

           1)如果没有匹配使用,内存泄漏&程序崩溃。

           2)如果析构函数没有给出,也没有来匹配使用,可能会造成内存泄漏。

.4.析构函数对内存泄漏的影响

    1)给出析构函数

        malloc ---> delete / delete [ ] (free)

        new ------>delete / delete [ ] (free)

       new [ ]-----> delete / delete [ ] (free)

     2)没有给出析构函数

       new--->free : 对象中的资源没有清理

       new---->delete [ ] :一定会崩溃

        new [ ] ---> free :对象中的资源没有清理&一定会崩溃

        new [ ]--->delete :只会销毁一个对象(N-1)个对象没有清理&一定会崩溃。

C/C++内存管理_第4张图片

四、定位new表达式

1.含义:在已经存在的空间上执行构造函数

 2.定义语法:new (地址)类型

 3.调用方式:operator new (size_t    void*where)比如:

int main()
{
    Test* pt=(Test*)malloc(sizeof(Test));
  
    new (pt) Test;//定位new表达式
    return 0;
}

五、malloc / free 和new / delete 的区别和联系

1.malloc / free :C语言中      new / delete :C++中

2.malloc / free :是函数         new / delete :  操作符

3.参数上:malloc(字节数)    new + 类型

4.返回值上:malloc-->void* (可以强制转换)    new 不需要

5.malloc 要判断是否为空     new 有应用措施,不要判空,捕获异常

6.malloc / free :不会调用构造/析构函数        new/delete:会调用构造/析构函数

7.malloc :不能初始化             new可以初始化

8.malloc  :在堆上申请        new:不一定在堆上,operator new(可以自定义申请的位置空间)

六、如何进行内存泄漏检测?

1.使用系统自带的内存泄漏的检测工具。

2.自己写一个内存泄漏检测工具。

3.使用第三方工具:VLD,DebugDiag  Tools等。

七、如何避免内存泄漏?

1 良好的编程规范

 2.智能指针

你可能感兴趣的:(C++)