目录
operator new 与operator delete函数
关于C/C++内存分布在另一篇博客写过,详情见点击
用malloc/calloc/realloc和free这四个函数申请释放堆上内存,在另一篇博客中写过,详情见点击
C 语言内存管理方式在 C++ 中可以继续使用,但有些地方就无能为力而且使用起来比较麻烦,因此 C++ 又提出 了自己的内存管理方式:通过 new 和 delete 操作符进行动态内存管理
1、申请和释放单个元素的空间,使用new和delete操作符,申请和释放连续的空间,使用new [ ]和delete [ ]
2、在申请自定义类型的空间时,new会调用构造函数,delete会调用析构函数
3、new申请空间失败会抛异常,malloc申请空间失败会返回NULL
- class Test
- {
- public:
- Test()
- : _data(0)
- {
- cout << "Test():" << this << endl;
- }
- ~Test()
- {
- cout << "~Test():" << this << endl;
- }
-
- private:
- int _data;
- };
- int main ()
- {
- // 申请单个Test类型的对象
- Test* p1 = new Test;
- delete p1;
-
- // 申请10个Test类型的对象
- Test* p2 = new Test[3];
- delete[] p2;
-
- system("pause");
- return 0;
- }
1、new 和 delete 是用户进行 动态内存申请和释放的操作符2、operator new 和 operator delete是系统提供的 全局函数。operator new底层用malloc实现,operator delete底层用free实现,区别在于operator new中malloc申请空间成功时直接返回内存首地址,申请失败会尝试执行空间不足应对措施,如果我们提供了应对策略,则继续尝试申请,否则抛出异常。3、 new 在底层调用 operator new 全局函数来申请空间, delete 在底层通过 operator delete 全局函数来释放空间。
内置类型:
如果申请的是内置类型的空间, new 和 malloc , delete 和 free 基本类似,不同的地方是: new/delete 申请和 释放的是单个元素的空间,new[] 和 delete[] 申请的是连续空间,而且 new 在申请空间失败时会抛异常,malloc会返回 NULL 。自定义类型:new 的原理
- 调用operator new函数申请空间
- 在申请的空间上执行构造函数,完成对象的构造
delete的原理
- 在空间上执行析构函数,完成对象中资源的清理工作
- 调用operator delete函数释放对象的空间
new T[N]的原理
- 调用operator new[]函数,在operator new[]中实际调用operator new函数完成N个对象空间的申请
- 在申请的空间上执行N次构造函数
delete[]的原理
- 在释放的对象空间上执行N次析构函数,完成N个对象中资源的清理
- 调用operator delete[]释放空间,实际在operator delete[]中调用operator delete来释放空间