1.c/c++内存分布
2.c++动态内存管理方式
c语言中malloc/calloc/realloc/free函数
C语言内存管理方式在C++中可以继续使用,但有些地方就无能为力而且使用起来比较麻烦,因此C++又提出了自己的内存管理方式:通过new和delete操作符进行动态内存管理。
void Test2()
{
// 动态申请一个int类型的空间
int* ptr4 = new int;
// 动态申请一个int类型的空间并初始化为10
int* ptr5 = new int(10);
// 动态申请10个int类型的空间
int* ptr6 = new int[3];
delete ptr4;
delete ptr5;
delete[] ptr6;
}
注意:申请和释放单个元素的空间,使用new和delete操作符,申请和释放连续的空间,使用new[]和 delete[]
3.new和delete操作自定义类型
class TT
{
public:
TT()
: _data(0)
{
cout << "TT():" << this << endl;
}
~TT()
{
cout << "~TT():" << this << endl;
}
private:
int _data;
};
void Test3()
{
// 申请单个Test类型的空间
TT* p1 = (TT*)malloc(sizeof(TT));
free(p1);
// 申请10个TT类型的空间
TT* p2 = (TT*)malloc(sizeof(TT) * 10);
free(p2);
}
void Test4()
{
// 申请单个TT类型的对象
TT* p1 = new TT;
delete p1;
// 申请10个TT类型的对象
TT* p2 = new TT[10];
delete[] p2;
}
int main()
{
cout << "Test3: " << endl;
Test3();
cout << "Test4: " << endl;
Test4();
return 0;
}
在申请自定义类型的空间时,new会调用构造函数,delete会调用析构函数,而malloc与free不会。
new和delete是用户进行动态内存申请和释放的操作符,operator new 和operator delete是系统提供的
全局函数,new在底层调用operator new全局函数来申请空间,delete在底层通过operator delete全局
函数来释放空间。
4. new和delete的实现原理
4.1内置类型
和malloc/free类似,不同的是new申请失败会抛出异常
4.2自定义类型
- new调用operator new函数申请空间
在申请空间上执行构造函数,完成对象的构造- delete调用operator delete函数释放对象的空间
在释放空间时执行析构函数,完成对象资源的释放
5.malloc/free和new/delete的区别
- malloc/free是函数,new/delere是操作符
- new/delete比malloc/free效率低,new/delete的底层封装了malloc/free
- malloc/free只是单纯的开辟空间,不会调用构造函数和析构函数,new申请空间时会完成对象的初始化
,delete释放空间时会调用析构函数清理资源。 - malloc返回值时void*,用的时候需要强转
- malloc申请失败会返回NULL,new会抛出异常