new delete 和 malloc free

1.new和malloc的区别

a.    malloc是库函数,new是关键字

b.    malloc分配的内存不能进行初始化,new分配的内存可以尽心初始化

c.    malloc分配内存失败会返回空指针,new分配内存失败会返回bad_alloc_error异常

d.    在申请数组内存空间的时候,new会多申请四个字节的内存,来存放对对象的个数

2.总结

3.内存池:new和delete的重载

// 对象池的初始个数
const int MEM_NODE_POOL_SIZE = 5;

template<typename T>
class CLink
{
public:
	CLink() { mphead = new Node(); }
	~CLink();
	void insertTail(const T &val);
	void removeHead();
	void show();
private:
	// new Node   delete Node*p;
	struct Node
	{
		Node(T data = T()) :mdata(data), mpnext(nullptr) {}
		/*
		给Node类型提供new和delete运算符的重载,
		自定义Node对象的内存管理方式,实现Node对象池功能
		new Node();  operator new(sizeof(Node))
		*/
		void* operator new(size_t size)
		{
			if (mpObjectPool == nullptr)
			{
				mpObjectPool = 
                                            (Node*)new char[MEM_NODE_POOL_SIZE * size];
                                //将分好的内存连接起来
				Node *pcur = mpObjectPool;
				for (; pcur < mpObjectPool + MEM_NODE_POOL_SIZE - 1;
					++pcur)
				{
					pcur->mpnext = pcur + 1;
				}
				pcur->mpnext = nullptr;
			}

			Node *palloc = mpObjectPool;
			mpObjectPool = mpObjectPool->mpnext;
			return palloc;
		}
		void operator delete(void *ptr)
		{
			Node *pfree = (Node*)ptr;
			pfree->mpnext = mpObjectPool;
			mpObjectPool = pfree;
		}
		T mdata;
		Node *mpnext;
		// 添加一个指向对象池的起始地址的指针
		static Node *mpObjectPool;
	};

	Node *mphead;
};

template<typename T>
//静态的成员变量类外进行初始化
typename CLink<T>::Node* CLink<T>::Node::mpObjectPool = nullptr;

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值