{
std::cout<<"call A::operator new"<
}
void* operator new(size_t size, const std::nothrow_t& nothrow_value)
{
std::cout<<"call A::operator new nothrow"<
}
};
int _tmain(int argc, _TCHAR* argv[])
{
A* p1 = new A;
delete p1;
A* p2 = new(std::nothrow) A;
delete p2;
system("pause");
return 0;
}
#include
class A
{
public:
A()
{
std::cout<<"call A constructor"<
~A()
{
std::cout<<"call A destructor"<
void* operator new(size_t size)
{
std::cout<<"call A::operator new"<
}
void* operator new(size_t size, const std::nothrow_t& nothrow_value)
{
std::cout<<"call A::operator new nothrow"<
}
};
int _tmain(int argc, _TCHAR* argv[])
{
A* p1 = new A;
delete p1;
A* p2 = new(std::nothrow) A;
delete p2;
system("pause");
return 0;
}
如果类A中没有对operator new的重载,那么new A和new(std::nothrow) A;都将会使用全局operator new(size_t size)。可将A中两个operator new注释掉,并且在A外添加一个全局operator new重载:
[cpp]
void* ::operator new(size_t size)
{
std::cout<<"call global operator new"<
}
void* ::operator new(size_t size)
{
std::cout<<"call global operator new"<
}程序输出:
注意,这里的重载遵循作用域覆盖原则,即在里向外寻找operator new的重载时,只要找到operator new()函数就不再向外查找,如果参数符合则通过,如果参数不符合则报错,而不管全局是否还有相匹配的函数原型。比如如果这里只将A中operator new(size_t, const std::nothrow_t&)删除掉,就会报错:
error C2660: “A::operator new”: 函数不接受 2 个参数。
至于placement new,它本身就是operator new的一个重载,不需也尽量不要对它进行改写,因为它一般是搭配 new(p) A(); 工作的,它的职责只需简单返回指针。
对operator new的重载还可以添加自定义参数,如在类A中添加
[cpp]
void* operator new(size_t size, int x, int y, int z)
{
std::cout<<"X="<
class A
{
public:
A()
{
std::cout<<"call A constructor"<
~A()
{
std::cout<<"call A destructor"<
void* operator new(size_t size, const char* file, int line)
{
std::cout<<"call A::operator new on file:"<
return NULL;
}
};
//Test.cpp
#include
#include "A.h"
#define new new(__FILE__, __LINE__)
int _tmain(int argc, _TCHAR* argv[])
{
A* p1 = new A;
delete p1;
A* p2 = new A;
delete p2;
system("pause");
return 0;
}
//A.h
class A
{
public:
A()
{
std::cout<<"call A constructor"<
~A()
{
std::cout<<"call A destructor"<
void* operator new(size_t size, const char* file, int line)
{
std::cout<<"call A::operator new on file:"<
return NULL;
}
};
//Test.cpp
#include
#include "A.h"
#define new new(__FILE__, __LINE__)
int _tmain(int argc, _TCHAR* argv[])
{
A* p1 = new A;
delete p1