深入理解new和delete的原理
#include<iostream>
using namespace std;
/*
如何实现一个工具 检测内存泄漏 new操作没有对应的delete 用映射表记录那些内存被开辟过了,删除掉
对内存的开辟和释放都有所记录
*/
/*
new和delete可以混用吗?C++为什么区分单个元素和数组的内存分配和释放呢
使用int等内置类型的时候不会出现什么错误
*/
/*
new 和 delete
new/delete 本质运算符重载函数的调用
malloc和new的区别
malloc按字节开辟内存,new开辟内存需要指定类型
malloc开辟内存返回的都是void* new调用运算符重载 operator new-> int* 返回值自动返回指定类型的指针
malloc只负责开辟空间,new不仅开辟还做数据初始化
malloc开辟内存失败返回nullptr指针,new 抛出的是bad_alloc类型的异常
malloc是函数,new是关键字
free和delete的区别
delete 先调用析构函数,再使用free
*/
//先调用operator new开辟内存空间 然后调用对象的构造函数(初始化)
void* operator new(size_t size)
{
void* p = malloc(size);
if (p == nullptr)
{
throw bad_alloc();
}
cout << "operator new addr:" << p <<endl;
return p;
}
//delete p
//1.调用p指向对象的析构函数,2.调用operator delete释放内存空间
void operator delete(void* ptr)
{
cout << "operator delete[] addr:" << ptr << endl;
free(ptr);
}
void* operator new[](size_t size)
{
void* p = malloc(size);
if (p == nullptr)
{
throw bad_alloc();
}
cout << "operator new addr:" << p << endl;
return p;
}
void operator delete[](void* ptr)
{
cout << "operator delete addr:" << ptr << endl;
free(ptr);
}
class Test
{
public:
Test(int data = 10)
:ptr(new int (data))
{
cout << "Test()" << endl;
}
~Test()
{
cout << "~Test()" << endl;
}
private:
int* ptr;
};
int main()
{
try
{
int* p = new int;
delete p;
}
catch (const bad_alloc &err)
{
cerr << err.what() << endl;
//返回const char*
}
Test* p1 = new Test();
delete p1;
Test* p2 = new Test[10]();
delete[] p2;
return 0;
}
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/e2bc548067e953cf66fc8b32a6f09a31.png)
重载new/delete实现对象池