C++动态内存管理

首先弄清各变量在内存中存在位置:

C++动态内存管理

回顾:

C语言动态内存管理:

  • malloc: 在堆上申请空间,不会初始化,申请成功返回这个空间的指针,失败返回NULL。
  • calloc: 在中申请nmemb *size字节大小的连续地址空间,初始化为0,申请成功返回这个空间的指针,失败返 NULL。
  • realloc: 给已有的内存扩容;

1.如果当前连续内存块足够 realloc 的话,只是将p所指向的空间扩大,并返回原始的指针地址;

2.如果当前连续内存块不够长度,再找一个足够长的地方,分配一块新的内存,并将原始指针指向的内容 copy到 新指针指向的空间,返回新指针。并将原始指针所指向的内存空间释放。

  • free: 释放掉动态申请的空间。

 

注意事项

  • malloc()函数返回的是 void * 类型,必须通过 (int *) 来将强制转换, 否则编译将会出错; 
  • 内存分配必须足够, 比如:(int*)malloc(1)分配的只是一字节空间, 当存入一个整数时, 剩  下的三个字节将会覆盖后面的内存。

 

C++动态内存管理:

  • new: 分配一种类型的一个大小的内存空间,并用默认构造函数来初始化这个变量;
  • new[ ]: 分配一种类型的n个大小的内存空间,并用默认构造函数来初始化这些变量;
  • delete: 调用析构函数清理空间,然后释放空间;
  • delete[ ]: 调用n次析构函数清理空间,然后释放空间。

 

注意事项:

  • new和delete匹配使用;new[ ]和delete匹配使用。

必须匹配使用的原因:对于内置类型来说对于不匹配使用没有问题,但对于其他自定义类型来说,不匹配使用可能会错误释放内存导致出错,比如使用了new申请空间,若使用delete[ ]释放空间,会多余释放其他内存的空间,程序就崩了。

 

C++和C语言申请空间方式的联系:

C++中调用方式:

C++动态内存管理C++动态内存管理

 

C++为何还要存在new动态管理空间:C++是面向对象的语言,他出现了类,因为类里面有许多的成员变量,如果一次初始化效率会块很多,而C++的申请空间方式是对C语言的申请方式做了封装,使C++动态申请空间如果申请空间失败后会抛异常。