C++ 对于重载了运算符new的类,可以使用全局运算符new吗?

C++ 对于重载了运算符new的类,可以使用全局运算符new吗?,c++,memory-management,operator-overloading,C++,Memory Management,Operator Overloading,假设我有一个重载了操作符new的类 class Class { public: void* operator new( size_t ); void operator delete( void* ); }; 当我使用新类()时,该类的对象是否总是使用重载的运算符new分配?或者当新类()构造出现在代码中时,是否可能使用默认的运算符new,但这是另一种语法 将始终使用重载的运算符new和运算符delete,除非您明确执行以下操作: // Allocate using global n

假设我有一个重载了
操作符new
的类

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

当我使用
新类()
时,该类的对象是否总是使用重载的
运算符new
分配?或者当
新类()
构造出现在代码中时,是否可能使用默认的
运算符new
,但这是另一种语法

将始终使用重载的
运算符new
运算符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);
或者,作为一个有点极端的说明性例子,类似这样的事情:

// 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);
#包括
//使用global placement new在global new创建的缓冲区中进行分配。
MyClass*my_对象=::新建(::运算符新建(sizeof(MyClass)))MyClass()
//正常使用对象。
我的_对象->我的_方法();
//显式调用析构函数。
my_对象->~MyClass();
//显式释放内存。
::运算符删除(我的对象);

希望这能有所帮助。

使用范围解析运算符(::)调用
运算符new
的全局定义,否则它将始终使用重载的
运算符new
,当然,在
放置新运算符
的情况下除外,这无论如何都不打算重载

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;
}

请注意删除运算符使用了相应的定义。

顺便说一句,placement new可以重载-是的,我的意思是OP不打算在他的示例中重载它。@sharptooth,@GMan:placement new是
new
的重载。