Могу ли я использовать глобальный оператор new для класса, в котором оператор new перегружен? - PullRequest
2 голосов
/ 09 сентября 2010

Предположим, у меня есть класс с перегруженным operator new.

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

Будут ли объекты этого класса всегда выделяться с перегруженным operator new при использовании new Class() или возможно, что по умолчаниюoperator new используется, когда в коде появляется конструкция new Class()?

Ответы [ 3 ]

5 голосов
/ 09 сентября 2010

Используйте оператор разрешения области (: :), чтобы вызвать глобальное определение для 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;
}

Обратите внимание на использование соответствующего определения для оператора удаления.

2 голосов
/ 09 сентября 2010

Перегруженные 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);

Надеюсь, это поможет.

0 голосов
/ 09 сентября 2010

Единственное возможное исключение, о котором я могу подумать, это размещение нового (обсуждается здесь) , но это другой синтаксис.

...