自定义new和delete

#include "stdafx.h"
#include <stdlib.h>
#include <malloc.h>

#include <iostream>
#include<windows.h>
using namespace std;

class Myclass;
Myclass* x1 = NULL;
Myclass* x2 = NULL;
Myclass* x3 = NULL;
class Myclass
{
public:
	Myclass();
	~Myclass();
public:
	void* operator new(size_t);
	void operator delete(void*);
public:
	static int m_num;
};

int Myclass::m_num = 0;
Myclass::Myclass()
{

}

Myclass::~Myclass()
{
}

void* Myclass::operator new(size_t size)
{
	++Myclass::m_num;
	if (m_num >= 3)
	{
		MessageBox(0,L"You could only new three times",L"new",0);
	}

	void *storage = malloc(size);
	if(NULL == storage) {
		throw "allocation fail : no free memory";
	}
	return storage;
}

void Myclass::operator delete(void* pointee)
{
	cout<<"operator delete"<<endl;
	::operator delete(pointee);
}

int _tmain(int argc, _TCHAR* argv[])
{
	x1 = new Myclass;
	delete(x1);
	x2 = new Myclass;
	delete(x2);
	x3 = new Myclass;
	delete(x3);

	system("pause");
	return 0;
}
时间: 2024-08-03 23:46:09

自定义new和delete的相关文章

Item 50:为什么需要自定义new和delete?

Item 50: Understand when it makes sense to replace new and delete. 我们在Item 49中介绍了如何自定义new的错误处理函数,以及如何为你的类重载operator new. 现在我们回到更基础的问题,为什么我们需要自定义operator new或operator delete? 检测使用错误.new得到的内存如果没有delete会导致内存泄露,而多次delete又会引发未定义行为.如果自定义operator new来保存动态内存

delete 与 delete []

/* Module: delete与delete[]的区别.cpp Notices: Copyright (c) 2017 Landy Tan */ #include <iostream> using namespace std; //////////////////////////////////////////////////////////////// class CT { public: inline CT(){ cout << "CT()" <&

[原] inline operator delete &amp; DLL boundary

之前写在百度空间的这篇文章: [百度空间] [原] 全局operator delete重载到DLL 首先,纠正一个词“重载”,operator new/delete是替换(replacement),不是重载.只要任意一个编译单元定义了替换函数,并不需要全局声明,就会替换掉全局的默认operator new/delete, 这个行为非常像gcc的strong symbol/weak symbol. 最近翻看了C++03的标准: 3. The program’s de?nitions are use

Item 52:写了placement new就要写placement delete

Item 52: Write placement delete if you write placement new "placement new"通常是专指指定了位置的new(std::size_t size, void *mem),用于vector申请capacity剩余的可用内存. 但广义的"placement new"指的是拥有额外参数的operator new. new和delete是要成对的,因为当构造函数抛出异常时用户无法得到对象指针,因而delete

【IOS】UITableView样式的自定义

很多时候,我们需要自定义UITableView来满足我们的特殊要求.这时候,关于UITableView和cell的自定义和技巧太多了,就需要不断的总结和归纳. 1.添加自定义的Cell. 这个问题已经涉及过,但是,这里要说的主要是两种方法的比较! 因为,我经常发现有两种方式: 1.xib方式 这种方式,也就是说,为自定义的UITableViewCell类添加一个xib的文件.并且让两者关联. 这时候,写法为: // 返回cell - (UITableViewCell *)tableView:(U

《Effective C++》读书笔记汇总

我之前边读<Effective C++>边写下每个条款的读书笔记,这一版是C++11之前的版本.这里我将每个条款令我印象深刻的点小结一下. 1.C++包括:Plain C(面向过程).OOP(面向对象).模板(泛型和模板元编程).STL(C++标准库). 2.用inline.enum.const代替#define.#define定义的宏,一旦复杂起来,高手都很难掌控.不要带入C的习惯. 3.灵活使用const前缀.不需要进行改变的数据加上const前缀.指针的const前缀有两种形式,cons

吐槽C++

个人感觉,在c++ 道路的学习路上,遇到很多的坎坷,现在回想起来,最关键一点就是 c++知识点繁杂很多,教科书很多知识点都没有提到. 但是在实际工作中,这些没有提到的知识点,却又经常会用到(或者看开源代码里面有).导致很多的代码看不懂,给弱小的内心受到不小的打击.一本大而全的C++书籍,虽难部分知识点当时可能看不懂,但是如果工作遇到后会再过去查得,但是书籍中不能因为隐蔽就不提.给学生一些恐慌. 比如:复制构造函数 与 赋值函数 的区别     ------如果教科书能提到这些感念,就不会对这块知

复制构造函数 与 赋值函数 的区别(转)

转自:jihite 构造函数.析构函数.赋值函数是每个类最基本的的函数.每个类只有一个析构函数和一个赋值函数.但是有很多构造函数(一个为复制构造函数,其他为普通构造函数.对于一个类A,如果不编写上述四个函数,c++编译器将自动为A产生四个默认的函数,即: A(void)                                    //默认无参数构造函数 A(const A &a)                         //默认复制构造函数 ~A(void);         

C++内存分配new

new表达式在内存生存周期内创建并初始化对象(两阶段:1.调用operator new创建内存,2.调用构造函数构造对象)也就是说,动态创建的对象其生命周期可能超出其创建的作用域.new的语法为: ::(optional) new (placement_params)(optional) (type) initializer(optional) // 1) ::(optional) new (placement_params)(optional) type initializer(optiona