Здравствуйте, mihapro, Вы писали:
M>Разьясните мне такое поведение компилятора:
M>Есть проект, в нём используется выделение памяти через new.
M>Делаю ещё один файл cpp. Пишу в нём перегрузку оператора new. Заголовочного файла не делаю. Этот файл просто компилится. И после ребуидла уже все вызовы new залинкованы на это переопределение.
M>Мне непонятно то, что здесь нет явного объявления этой функции в других исходниках. Компилятор сам решил все вызовы перестроить на этот new.
M>Скажите, это поведение нормально? Оно гдето описано?
// mem2.cpp : Defines the entry point for the console application.
//
void * operator new (size_t size)
{
return 0;
}
// mem.cpp : Defines the entry point for the console application.
//
#include <windows.h>
void * operator new (size_t size)
{
return (void*)1;
}
int main(int argc, char* argv[])
{
int * a= new int;
if (a== NULL)
MessageBox(0, "UPS", 0, 0);
if (a == (void*)1)
MessageBox(0, "UPS1", 0, 0);
delete a;
return 0;
}
пробуем компилировать:
mem2.obj : error LNK2005: "void * __cdecl operator new(unsigned int)" (??2@YAPAXI@Z) already defined in mem.obj
Debug/mem.exe : fatal error LNK1169: one or more multiply defined symbols found
Error executing link.exe.
mem.exe — 2 error(s), 0 warning(s)
Оператор это же такая же функция. Мы же можем вызвать функцию определенную в
другом файле, если она только не объявлена с модификатором static.
Определение (набор параметров) оператора new стандартизировано. Поэтому никаких заголовочных файлов не нужно.
Если в проекте оператор new не определен он берется из стандартной библиотеки.
Если Вы хотите использовать new только в одном файле поставьте перед ним static.
// mem2.cpp : Defines the entry point for the console application.
//
static void * operator new (size_t size)
{
return 0;
}
...