Разьясните мне такое поведение компилятора:
Есть проект, в нём используется выделение памяти через new.
Делаю ещё один файл cpp. Пишу в нём перегрузку оператора new. Заголовочного файла не делаю. Этот файл просто компилится. И после ребуидла уже все вызовы new залинкованы на это переопределение.
Мне непонятно то, что здесь нет явного объявления этой функции в других исходниках. Компилятор сам решил все вызовы перестроить на этот new.
Скажите, это поведение нормально? Оно гдето описано?
Re: Перегрузка глобального оператор new, есть вопросы...
Здравствуйте, 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;
}
...
Re: Перегрузка глобального оператор new, есть вопросы...
Здравствуйте, mihapro, Вы писали:
M>Разьясните мне такое поведение компилятора: M>Есть проект, в нём используется выделение памяти через new. M>Делаю ещё один файл cpp. Пишу в нём перегрузку оператора new. Заголовочного файла не делаю. Этот файл просто компилится. И после ребуидла уже все вызовы new залинкованы на это переопределение. M>Мне непонятно то, что здесь нет явного объявления этой функции в других исходниках. Компилятор сам решил все вызовы перестроить на этот new. M>Скажите, это поведение нормально? Оно гдето описано?
Явное объявление этой функции располагается в заголовочных файлах стандартной библиотеки. Когда ты предоставляешь свою реализацию функции '::operator new', ты не перегружаешь стандартную реализацию (как обычно выражаются), а замещаешь ее.
Best regards,
Андрей Тарасевич
Re[2]: Перегрузка глобального оператор new, есть вопросы...
Здравствуйте, template, Вы писали:
T>Оператор это же такая же функция. Мы же можем вызвать функцию определенную в T>другом файле, если она только не объявлена с модификатором static.
T>Определение (набор параметров) оператора new стандартизировано. Поэтому никаких заголовочных файлов не нужно.
T>Если в проекте оператор new не определен он берется из стандартной библиотеки.
T>Если Вы хотите использовать new только в одном файле поставьте перед ним static.
Спасибо за ответ. Картина более менее прояснилась. Я просто изначально считал, что глобально переопределив new я могу вызвать в нужный мне момент стандартный.
Re[2]: Перегрузка глобального оператор new, есть вопросы...
Здравствуйте, Андрей Тарасевич, Вы писали:
АТ>Явное объявление этой функции располагается в заголовочных файлах стандартной библиотеки. Когда ты предоставляешь свою реализацию функции '::operator new', ты не перегружаешь стандартную реализацию (как обычно выражаются), а замещаешь ее.
Механизм понятен. Андрей, не могли бы меня направить в нужный раздел MSDN, про замещение почитать?
Re[3]: Перегрузка глобального оператор new, есть вопросы...
Здравствуйте, mihapro, Вы писали:
АТ>Явное объявление этой функции располагается в заголовочных файлах стандартной библиотеки. Когда ты предоставляешь свою реализацию функции '::operator new', ты не перегружаешь стандартную реализацию (как обычно выражаются), а замещаешь ее.
M>Механизм понятен. Андрей, не могли бы меня направить в нужный раздел MSDN, про замещение почитать?
В MSDN про такие тонкости не пишут. Скорее всего MSDN будет использовать термин "перегрузка" по отношению к замещению '::operator new'. Может лучше на эту тему Страуструпа почитать?