Я написал небольшую программу в 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 является настолько особенным, одно правило определения не применяется здесь?
Спасибо.
Обратите внимание, что вы должны всегда выполнять соответствующий 'operator delete' для каждого введенного вами' operator new'. (Я знаю, это было просто для того, чтобы показать свою точку зрения, но я просто не могу заставить себя стоять без этого предупреждения.) – sbi
Возможно, вам следует изменить заголовок вопроса, я думал, что вы хотели бы знать различные варианты замены это, когда на самом деле вы хотели знать, почему его замена не вызвала ошибку. –