我们都知道:
- 栈又叫堆栈--存放非静态局部变量/函数参数/返回值等等,栈是向下增长的。
- 堆用于程序运行时动态内存分配,堆是可以上增长的。
- 数据段--存储全局数据和静态数据。
- 代码段--可执行的代码/只读常量
C/C++ 中的程序内存区域划分
C++内存管理方式
在C++中,C语言中用malloc/calloc/realloc函数来开辟动态内存空间的方法依然可以使用,但C++提出了新的内存管理方式:通过new和delete操作符来管理内存空间
对于内置类型来说:
管理对象:
//开空间
int* pp = new int;
delete pp;
//开辟内存空间并初始化
int* ptr = new int(10);
cout << *ptr << endl;
//回收空间
delete ptr;
管理对象数组:
int* p = new int[4]{ 1,2,34,4 };
for (int i = 0;i < 4;i++)
{
cout << p[i] << " ";
}
cout << endl;
delete[] p;
申请和释放单个元素的空间,使用new和delete操作符,申请和释放连续的空间,使用new[]和delete[],注意:匹配起来使用。
对于自定义类型
可以清楚的看到,new不仅开辟空间初始化,并且还调用了构造函数,因此,delete不仅会回收空间,还会调用析构。
在申请自定义类型的空间时, new 会调用构造函数, delete 会调用析构函数,而 malloc 与free 不会
malloc/free和new/delete的区别
首先从他们两的定义来说,malloc/free都是c的库函数,而new/delete都是操作符
然后从用法上来说,malloc/free比new/delete要麻烦的多。要使用malloc的话,要先计算好类型的大小,而new不用;malloc函数的返回值是void*,要把返回值强制转为使用的类型,而new不用;malloc如果失败,返回值为NULL,要对其进行判空,new只要捕获异常即可;malloc函数只是开辟空间,new开辟空间并且初始化。
最重要的是,malloc/free只是开辟空间和回收空间,而new/delete可以开辟空间并初始化,如果是自定义类型的话,还会调用构造和析构。