new[]/delete[]与new/delete完全不同-动态对象数组创建通过new[] 完成-动态对象数组的销毁通过delete[]完成-new[]/delete[]能够被重载,进而改变内存管理方式
new[]/delete[]的重载方式
//static member function
void* operator new[](unsigned int size)
{
return malloc(size);
}
//static member function
void operator delete[](void* p)
{
free(p);
}
注意事项:
-new[]实际需要返回的内存空间可能比期望的要多
-对象数组占用的内存中需要保存数组信息(数组的长度,因为编译器要为我们自动的调用构造函数和析构函数,如果不知道这个值,编译器无法知道调用几次构造和析构函数)
-数组信息用于确定构造函数和析构函数的调用次数
动态数组的内存管理
#include <iostream>
#include <string>
#include <cstdlib>
using namespace std;
class Test
{
private:
int m_value;
public:
Test()
{
m_value = 0;
}
void* operator new(unsigned int size)
{
cout << "operator new :" << size <<endl;
return malloc(size);
}
void operator delete(void* p)
{
cout << "operator delete:" << p << endl;
free(p);
}
void* operator new[](unsigned int size)
{
cout << "operator new[] :" << size <<endl;
return malloc(size);
}
void operator delete[](void* p)
{
cout << "operator delete[]:" << p << endl;
free(p);
}
};
int main()
{
Test* pt = NULL;
pt = new Test;
delete pt;
pt = new Test[5];
delete[] pt;
return 0;
}
从打印结果看,new[]实际需要返回的内存空间没有比期望的多,就是20个字节。这是由于编译器的不同而造成的。
new[]/delete[]的重载方式//static member functionvoid* operator new[](unsigned int size){return malloc(size);}
//static member functionvoid operator delete[](void* p){free(p);}