new和delete

深入理解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;
}

在这里插入图片描述

重载new/delete实现对象池

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值