#include <iostream>
#include <cstdlib>
using namespace std;
/*
类名:Demo
*/
class Demo
{
public:
// Demo类的构造函数
Demo(){ cout << "Demo()" << endl; }
// Demo类的析构函数
~Demo(){ cout << "~Demo()" << endl; }
// 重载new运算符
static void* operator new(size_t bytes)
{
cout << "new Demo" << "\tbytes = " << bytes << endl;
if( 0 == bytes )
return NULL;
void *p = malloc(bytes);
return p;
}
// 重载delete运算符
static void operator delete(void* addr)
{
cout << "delete Demo" << endl;
if( NULL == addr )
return;
free(addr);
}
// 重载new[]运算符
static void* operator new[](size_t bytes)
{
cout << "new[] Demo" << "\tbytes = " << bytes << endl;
if( 0 == bytes )
return NULL;
void *p = malloc(bytes);
return p;
}
// 重载delete[]运算符
static void operator delete[](void* addr)
{
cout << "delete[] Demo" << endl;
if( NULL == addr )
return;
free(addr);
}
};
// 入口函数
int main()
{
cout << "===============================================" << endl;
Demo* p1 = new Demo; // 1.分配空间; 2.执行构造函数;
delete p1; // 1.执行析构函数; 2.释放空间;
cout << "===============================================" << endl;
Demo* p2 = new Demo[5]; // 这里会额外分配4个字节来保存分配空间个数
delete[] p2;
cout << "===============================================" << endl;
}
/*
执行结果:
===============================================
new Demo bytes = 1
Demo()
~Demo()
delete Demo
===============================================
new[] Demo bytes = 7 // 这里会分配额外4个字节来保存分配空间的个数
Demo() // 以便通知delete来释放多少个分配空间
Demo()
Demo()
~Demo()
~Demo()
~Demo()
delete[] Demo
===============================================
*/
分析:从上面程序执行结果可以看出,
在C++中分配内存的最小单位为1个字节,
因为计算机内存分配最小单位为1个字节。当分配一组内存的时候,
C++会为分配内存额外开上一个4个字节大小的空间,这多出来的4个字节的空间是为了通知delete应该释放多少个空间。再补充一点:
在C++中重载new和delete运算符无论加不加static修饰,C++都会认为是static。
C++中的new与delete简单浅析
最新推荐文章于 2024-07-16 07:15:00 发布