假设我有一个重载operator new
的类。
class Class {
public:
void* operator new( size_t );
void operator delete( void* );
};
当我使用operator new
时,是否总是使用重载的new Class()
分配该类的对象,或者当operator new
构造出现时,是否可能使用默认的new Class()
码?
答案 0 :(得分:5)
使用范围解析运算符(::)来调用operator new
的全局定义,否则它将始终使用重载operator new
,但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;
}
注意使用delete运算符的相应定义。
答案 1 :(得分:2)
除非您明确执行以下操作,否则将始终使用重载的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);
希望这有帮助。
答案 2 :(得分:0)
我能想到的唯一可能的例外是放置新的(discussed here),但这是一种不同的语法。