对于具有运算符new重载的类,我可以使用全局运算符new吗?

时间:2010-09-09 10:06:42

标签: c++ memory-management operator-overloading

假设我有一个重载operator new的类。

class Class {
public:
   void* operator new( size_t );
   void operator delete( void* );
};

当我使用operator new时,是否总是使用重载的new Class()分配该类的对象,或者当operator new构造出现时,是否可能使用默认的new Class()码?

3 个答案:

答案 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 newoperator 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),但这是一种不同的语法。