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;