2010-04-28 1 views
2

Я написал небольшую программу в VS2005, чтобы проверить, может ли быть перегружен глобальный оператор C++ new. Оно может.На глобальном операторе C++ new: почему его можно заменить

#include "stdafx.h" 
#include "iostream" 
#include "iomanip" 
#include "string" 
#include "new" 

using namespace std; 

class C { 
    public: 
     C() { cout<<"CTOR"<<endl; } 
}; 

void * operator new(size_t size) 
{ 
    cout<<"my overload of global plain old new"<<endl; 
    // try to allocate size bytes 
    void *p = malloc(size); 
    return (p); 
} 

int main() { 
    C* pc1 = new C; 
    cin.get(); 
    return 0; 
} 

В приведенном выше названии определено мое определение оператора new. Если я удалю эту функцию из кода, то вызовет новый оператор в C: \ Program Files (x86) \ Microsoft Visual Studio 8 \ VC \ crt \ src \ new.cpp.

Все это хорошо. Однако, на мой взгляд, мои реализации оператора new НЕ перегружают новое в new.cpp, он НЕ ПОДВЕРГАЕТСЯ с ним и нарушает правило с одним определением. Почему компилятор не жалуется на это? Или стандарт говорит, что, поскольку оператор new является настолько особенным, одно правило определения не применяется здесь?

Спасибо.

+3

Обратите внимание, что вы должны всегда выполнять соответствующий 'operator delete' для каждого введенного вами' operator new'. (Я знаю, это было просто для того, чтобы показать свою точку зрения, но я просто не могу заставить себя стоять без этого предупреждения.) – sbi

+1

Возможно, вам следует изменить заголовок вопроса, я думал, что вы хотели бы знать различные варианты замены это, когда на самом деле вы хотели знать, почему его замена не вызвала ошибку. –

ответ

7

Да, глобальный operator new является особенным в том, что программы могут обеспечить реализацию замены для него.

Сменные формы - это формы одного объекта и массива operator new и operator delete и варианты «без броска». Другие формы, такие как размещение новых, не подлежат замене.

+0

вернитесь на работу :-) – Simon

+1

@Simon: Это обеденный перерыв :-) –

+0

ОК, тогда для вас есть выгода – Simon

Смежные вопросы