c++动态内存管理
//c语言动态内存管理
c语言使用malloc/calloc/realloc/free进行动态内存管理
malloc是不初始化的开辟空间,其参数为空间的大小,单位为字节;
calloc是初始化的进行开辟空间,其参数为(元素个数,大小),单位为字节。
realloc增容,如果后面的空间足够的话,就直接追加到其后方空间。如果后面的空间不够的话,realloc会重新找一块可以满足大小的空间进行开辟,并将之前空间的内容拷贝过去。
free是空间的释放。与malloc/calloc/realloc匹配使用。
//c++动态内存管理
c++通过new和delete动态管理内存。
new/delete动态管理对象。
new[]/delete[]动态管理对象数组。
接下来看一段代码:
#include <iostream>
using namespace std;
int main()
{
int* p1 = new int;//动态分配4个字节(1个int)的空间单个数据
int* p2 = new int(3);//动态分配4个字节(1个int)的空间并初始化为3
int *p3 = new int[3];//动态分配12个字节(3个int)的空间
delete p1;
delete p2;
delete[] p3;
return 0;
}
注意malloc/free new/delete new[]/delete[]一定匹配使用,否则可能出现内存泄漏甚至崩溃的问题。
//内存管理
(1)栈又叫堆栈,非静态局部变量/函数参数/返回值等等,栈是向下增长的。
(2)内存映射段是高效的I/O映射方式,用于装载一个共享的动态内存库。用户可使用系统接口创建共享内存,做进程间通信。
(3)堆用于程序运行时动态内存分配,堆是可以向上增长的。
(4)数据段--存储全局数据和静态数据。
(5)代码段--可执行的代码/只读常量。
//深入理解c++动态内存管理
【malloc/free和new/delete的区别和联系】
(1)他们都是动态内存的入口。
(2)malloc/free是c/c++标准库函数,new/delete是c++操作符。
(3)malloc/free只是动态分配内存空间/释放空间。而new/delete除了分配空间还会调用构造函数和析构函数进行初始化与清理。
(4)malloc需要手动计算类型大小且返回值为void*,而new可自己计算类型的大小,返回对应类型的指针。
//c++的其他内存管理接口
void*opreator new(size_t size);
void opreator delete(void*p);
void*opreator new[](size_t size);
void opreator delete[](void*p);
这些函数并没有重载new或delete表达式。其用法跟malloc/free用法一样,只负责分配空间/释放空间,不会调用对象构造函数/析构函数来初始化/清理对象。
实际也只是malloc/free的一层封装。
new做了两件事(1)调用opreator new分配空间。(2)调用构造函数初始化对象。
delete也做了两件事(1)调用析构函数清理对象(2)调用opreator delete释放空间。
new[N] (1)调用opreator new[]分配空间。(2)调用N次构造函数初始化对象。
delete[] (2)调用N次析构函数清理对象。(2)调用调用opreator delete释放空间。
//定位new表达式
定位new表达式是在已分配的原始内存空间中调用构造函数初始化一个对象。
new(place_address)type
new(place_address)type(initializer-list)
place_address必须是一个指针,initializre-list是类型的初始化列表。
//深度剖析new/delete&new[]/delete[]
//扩展学习
计算机的存储硬件体系设计跟皇权体系中的信息传递有异曲同工之处。