new delete 和 malloc free

版权声明:本节目由WolfOnTheWay独家播出 https://blog.csdn.net/qq_42214953/article/details/89152921

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;

猜你喜欢

转载自blog.csdn.net/qq_42214953/article/details/89152921