内存区域划分
常见内存区域划分如下
说明:
- 栈又叫堆栈,存储非静态的局部变量、函数参数、返回值等,栈是向下增长的。
- 堆用于程序运行时的动态内存分配,malloc申请空间就是在堆上申请的,堆是向上增长的。
- 数据段,存储全局数据和静态数据
- 代码段,存储可执行代码和只读常量。
内存管理
在C语言中,我们通常使用malloc、realloc、calloc等函数动态开辟空间,最后通过free释放掉空间。在C++中,新增了自己的内存管理方式:通过new和delete操作符进行动态内存管理。C语言的malloc、free同样在C++适用。
int main()
{
// 动态申请一个int类型的空间
int* ptr1 = new int;
// 动态申请一个int类型的空间并初始化为10
int* ptr2 = new int(10);
// 动态申请10个int类型的空间
int* ptr3 = new int[10];
delete ptr1;
delete ptr2;
delete[] ptr3;
return 0;
}
申请和释放单个元素的空间,使用new和delete操作符;申请和释放连续的空间,使用new[ ]和 delete[ ]
new和delete还适用于申请和销毁自定义类型
class A
{
private:
int _a;
int _b;
};
int main()
{
//p指向一个new出来的A类对象
A* p = new A;
return 0;
}
在申请自定义类型空间时,new会去调用改类型的构造函数,delete会去调用析构函数。而maloc和free就不会这么做。
new和delete底层代码
operator new实际上就是通过malloc申请的空间,operator delete就是通过free释放的空间
delete的底层调用没有找出来,不过确实是调用了free来实现的。
想详细了解operator new和operator delete的可以百度。