假设我有一个超载的类operator new
。我可以使用全局运算符new作为运算符new重载的类吗?
class Class {
public:
void* operator new(size_t);
void operator delete(void*);
};
会该类的对象总是与重载operator new
被分配当我使用new Class()
或者是有可能,当new Class()
结构出现在代码中的默认operator new
使用?
假设我有一个超载的类operator new
。我可以使用全局运算符new作为运算符new重载的类吗?
class Class {
public:
void* operator new(size_t);
void operator delete(void*);
};
会该类的对象总是与重载operator new
被分配当我使用new Class()
或者是有可能,当new Class()
结构出现在代码中的默认operator new
使用?
重载operator new
和operator delete
会一直使用,除非你明确做这样的事情:或者
// Allocate using global new.
MyClass* my_object = ::new MyClass();
// Use object normally.
my_object->my_method();
// Deallocate using global delete.
::delete my_object;
,作为一个有点极端的说明性的例子,这样的事情:
#include <new>
// Use global placement new to allocate in a buffer created by global new.
MyClass* my_object = ::new(::operator new(sizeof(MyClass))) MyClass()
// Use object normally.
my_object->my_method();
// Explicitly invoke destructor.
my_object->~MyClass();
// Explicitly deallocate memory.
::operator delete(my_object);
希望这帮助。
我能想到的唯一可能的例外是放置新(discussed here),但这是一种不同的语法。
使用范围分辨率操作符(::)来调用全局定义为operator new
,否则会一直使用重载的operator new
,除非ofcourse在placement new operator
情况下,这是无论如何不打算过载。
class Test {
public:
void* operator new(size_t);
void operator delete(void*);
};
int main()
{
Test* pTest1 = ::new Test();
Test* pTest2 = new Test();
/*
do some stuff
*/
::delete pTest1;
delete pTest2;
return 0;
}
请注意使用删除操作符的相应定义。
顺便说一句,放置新的可以被重载 - http://stackoverflow.com/questions/3675059/how-could-i-sensibly-overload-placement-operator-new – sharptooth 2010-09-09 12:47:50
是的,我的意思是OP不打算超载在他的例子中。 – Hemant 2010-09-09 12:53:04
@sharptooth:不,它不能。 – GManNickG 2010-09-09 13:47:21