目录
一、C/C++ 内存分布
二、C++动态管理内存:new与delete详解
1、new与delete的实现原理:
2、new与delete的使用
三、malloc/free和new/delete的区别
【注意】:栈区是向下增长的,即:数据存储由高地址向低地址延伸
堆区是向上增长的,即:数据存储由低地址向高地址延伸
【1】、内置类型
【3】、operator new与operator delete函数
new和delete是用户进行动态内存申请和释放的操作符,operator new 和operator delete是 系统提供的全局函数,new在底层调用operator new全局函数来申请空间,delete在底层通过 operator delete全局函数来释放空间。
【1】、对内置类型的操作
void Test()
{
// 动态申请一个int类型的空间
int* ptr1 = new int;
// 动态申请一个int类型的空间并初始化为10
int* ptr2 = new int(10);
// 动态申请3个int类型的空间
int* ptr3 = new int[3];
// 动态申请3个int类型的空间并初始化数组
int* ptr4 = new int[3] {1, 2, 3};
delete ptr1;
delete ptr2;
delete[] ptr3;
delete[] ptr4;
}
【2】、对自定义类型的操作
class A
{
public:
A(int a = 0)
: _a(a)
{
cout << "A():" << this << endl;
}
~A()
{
cout << "~A():" << this << endl;
}
private:
int _a;
};
int main()
{
// new/delete 和 malloc/free最大区别是 new/delete对于【自定义类型】除了开空间
//还会调用构造函数和析构函数
A* p1 = (A*)malloc(sizeof(A));
free(p1);
//对其传参进行初始化
A* p2 = new A(1);
delete p2;
//内置类型是几乎是一样的
int* p3 = (int*)malloc(sizeof(int));
free(p3);
int* p4 = new int;
delete p4;
//动态数组空间开辟
A* p5 = (A*)malloc(sizeof(A) * 10);
free(p5);
A* p6 = new A[10];
delete[] p6;
return 0;
}