new和delete操作自定义类型
申请和释放单个元素的空间,使用new和delete操作符,申请和释放连续的空间,使用new[]和 delete[]
在申请自定义类型的空间时,new会调用构造函数,delete会调用析构函数,而malloc与free不会。
new operator 与delete operator 函数
new operator 与delete operator 函数是内置函数,无法对其改变, C++中一般所使用的new就是所谓的new operator,它的功能如下:
- 分配足够的内存(实际大小是大于所创建的对象大小)
- 调用对象构造函数
delete operator则是:
- 先析构对象
- 释放空间(实际开辟的所有空间都释放)
operator new与operator delete函数
这两个函数可以根据相对应的内存分配策略进行重载,两个函数必须是成对重载,重载后的operator new 实际也是通过malloc来申请空间,如果malloc申请空间成功就直接返回,否则执行用户提供的空间不足应对措施,如果用户提供该措施就继续申请,否则就抛异常。operator delete 最终是通过free来释放空间的。
连续空间开辟new[]
开辟连续空间时,系统会多分配一个字节的空间用于存储cookie信息,该空间记录着开辟空间的大小,会随着空间的释放而释放掉。
实例
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
#include<assert.h>
using namespace std;
class Test
{
public:
Test(int data = 0) :m_data(data)
{
cout << "Create Test Obj:" << this << endl;
}
~Test()
{
cout << "Free Test Obj:" << this << endl;
}
public:
void* operator new(size_t sz)//申请空间
{
void *ptr = malloc(sz);
assert(ptr != nullptr);
return ptr;
}
void operator delete(void *ptr)//释放空间
{
if (ptr != nullptr)
free(ptr);
}
void* operator new[](size_t sz)
{
void *ptr = malloc(sz);
assert(ptr != nullptr);
return ptr;
}
void operator delete[](void *ptr)
{
if (ptr != nullptr)
free(ptr);
}
private:
int m_data;
};
int main()
{
Test *pt = new Test; //new 操作符 1申请空间 2构造对象
Test *pt1 = (Test*)::operator new(sizeof(Test)); //malloc 申请空间
Test *pt2 = new Test[10];
Test *pt3 = new Test;
delete pt;//1.析构对象 2.释放空间
delete pt1;
delete []pt2;
operator delete(pt3);//delete 释放空间
}