设为首页 加入收藏

TOP

C++拾遗--new delete 重载
2015-03-04 22:51:45 来源: 作者: 【 】 浏览:38
Tags:拾遗 --new delete 重载

前言


new和delete是操作动态内存的一对操作。对它们重载可以对内存管理进行有效的定制。


正文


1.局部重载


特别针对某一类型,对new和delete进行重载,可以对该类型对象的动态创建实行监控。如下代码:


代码一


#include
using namespace std;
class MyClass
{
public:
?MyClass()
?{
? cout << "MyClass()" << endl;
?}
?~MyClass()
?{
? cout << "~MyClass()" << endl;
?}
?void *operator new(std::size_t size)
?{
? cout << "局部new call" << endl;
? void *mem = malloc(size);? ?
? if (mem)? ? //内存分配失败,则返回0
? ?return malloc(size);
? else
? ?throw bad_alloc();? ? //内存分配失败,抛出异常
?}
?void operator delete(void *ptr)
?{
? cout << "局部delete call" << endl;
? //不为空,则调用free释放内存
? if (ptr)
? {
? ?free(ptr);
? }?
?}
};
int main()
{
?cout << "******局部new delete重载演示***by David***" << endl;
?MyClass *my = new MyClass;
?delete my;
?cin.get();
?return 0;
}


运行



运行结果表明


表达式new整合了内存分配和构造函数。先调用malloc分配内存,然后调用指定类型并相匹配的构造函数初始化该段内存。


表达式delete整合了析构函数和内存释放。先调用类的析构函数释放资源,后调用free释放分配的内存。


代码二


下面一个例子提供了对内存分配进行监控的一种方法。


#include
using namespace std;
class MyClass
{
public:
?//count记录未释放的对象个数
?static int count;
?int a;
?MyClass()
?{
? cout << "MyClass()" << endl;
? count++;
?}
?~MyClass()
?{
? cout << "~MyClass()" << endl;
? count--;
?}
?//new 局部重载
?void *operator new(size_t size)
?{
? cout << "局部new call" << endl;
? void *mem = malloc(size);? ? //内存分配失败,则返回0
? if (mem)
? ?return malloc(size);
? else
? ?throw bad_alloc();? ? //内存分配失败,抛出异常
?}
?//new[] 局部重载
?void *operator new[](std::size_t size)
?{
? cout << "局部new[] call" << endl;
? void *mem = malloc(size);? ? //内存分配失败,则返回0
? if (mem)
? ?return malloc(size);
? else
? ?throw bad_alloc();? ? //内存分配失败,抛出异常
?}
?//delete 局部重载
?void operator delete(void *ptr)
?{
? cout << "局部delete call" << endl;
? //不为空,则调用free释放内存
? if (ptr)
? {
? ?free(ptr);
? }
?}
?//delete[] 局部重载
?void operator delete[](void *ptr)
?{
? cout << "局部delete[] call" << endl;
? //ptr不为空,则调用free释放内存
? if (ptr)
? {
? ?free(ptr);
? }
?}
};
int MyClass::count = 0;
int main()
{
?cout << "******new delete 局部重载演示***by David***" << endl;
?cout << "起始MyClass::count = " << MyClass::count << endl;
?MyClass *my = new MyClass;
?delete my;
?cout << "-----------------" << endl;
?MyClass my1;
?cout << "-----------------" << endl;
?MyClass *mys = new MyClass[5];
?cout << "MyClass::count = " << MyClass::count << endl;
?delete[]mys;
?cout << "MyClass::count = " << MyClass::count << endl;
?cin.get();
?return 0;
}


运行



2.全局重载


对全局的new和delete重载可以监控所有类型的内存分配。


#include
#include
using namespace std;
class MyClass
{
public:
?MyClass()
?{
? cout << "MyClass()" << endl;
?}
?~MyClass()
?{
? cout << "~MyClass()" << endl;
?}
?void *operator new(std::size_t size)
?{
? cout << "MyClass::new重载" << endl;
? void *mem = malloc(size);
? if (mem)
? ?return mem;
? else
? ?throw bad_alloc();
?}
?void *operator new[](std::size_t size)
?{
? cout << "MyClass::new[]重载" << endl;
? void *mem = malloc(size);
? if (mem)
? ?return mem;
? else
? ?throw bad_alloc();
?}
?void operator delete(void *ptr)
?{
? cout << "MyClass::delete重载" << endl;
? if (ptr)
? {
? ?free(ptr);
? }
?}
?void operator delete[](void *ptr)
?{
? cout << "MyClass::delete[]重载" << endl;
? if (ptr)
? {
? ?free(ptr);
? }
?}
};
//全局new重载
void *operator new(std::size_t size)
{
?cout << "全局new重载" << endl;
?void *mem = malloc(size);
?if (mem)
? return mem;
?else
? throw bad_alloc();
}
//全局new[]重载
void *operator new[](std::size_t size)
{
?cout << "全局new[]重载" << endl;
?void *mem = malloc(size);
?if (mem)
? return mem;
?else
? throw bad_alloc();
}
//全局delete重载
void operator delete(void *ptr)
{
?cout << "全局delete重载" << endl;
?if (ptr)
?{
? free(ptr);
?}
}
//全局delete[]重载
void operator delete[](void *ptr)
{
?cout << "全局delete[]重载" << endl;
?if (ptr)
?{
? free(ptr);
?}
}
int main()
{
?cout << "******全局/局部new和delete都进行重载***by David***" << endl;
?int *p = new int;
?delete p;
?cout << "-------------------" << endl;
?double *ds = new double[10];
?delete[]ds;
?cout << "-------------------" << endl;
?MyClass *my = new MyClass;
?delete my;
?cout << "-------------------" << endl;
?MyClass *mys = new MyClass[3];
?delete[]mys;
?cin.get();
?return 0;
}


运行



如果类型重新定义了new 和 delete,则调用局部的,否则调用全局的。


细节


?


------------------------------分割线------------------------------


C语言梳理一下,分布在以下10个章节中:


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇C++拾遗--定位new表达式 下一篇C++拾遗--malloc free与new delet..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: