程序代码
如下所示:
#include<cstdio>
#include<cstdlib>
using namespace std;
void* operator new(size_t sz) //sz由编译器传入
{
printf("operator new: %d Bytes\n", sz);
void* m = malloc(sz);
if (!m)
puts("out of memory");
return m;
}
void operator delete(void* m)
{
puts("operator delete");
free(m);
}
class S
{
int i[100];
public:
S(){ puts("S::S()"); }
~S(){ puts("S::~S()"); }
};
int main()
{
puts("Creating & destroying an int");
int* p = new int(47);
delete p;
puts("Creating & destroying an S");
S* s = new S;
delete s;
puts("Creating & destroying S[3]");
S* sa = new S[3];
delete[]sa;
return 0;
}
输出结果
分析
可得如下几点:
- 动态分配内存与收回的过程为:operator new()接收编译器传入的长度参数size_t sz并分配内存→调用创建对象的构造函数→调用对象的析构函数→operator delete()接收析构函数传入的void*参数,执行内存释放,返回void。
- 本程序中未用iostream中的cin等,是为了防止创建一个iostream对象是,它们去调用new分配内存,造成死锁。
- 在创建类型为S的数组时,从所需要的字节数目中可以看到,额外的内存被分配用于存放它所包含的对象数量的信息。