Перегрузка глобального оператор new, есть вопросы...
От: mihapro Россия  
Дата: 04.05.03 12:28
Оценка:
Разьясните мне такое поведение компилятора:
Есть проект, в нём используется выделение памяти через new.
Делаю ещё один файл cpp. Пишу в нём перегрузку оператора new. Заголовочного файла не делаю. Этот файл просто компилится. И после ребуидла уже все вызовы new залинкованы на это переопределение.
Мне непонятно то, что здесь нет явного объявления этой функции в других исходниках. Компилятор сам решил все вызовы перестроить на этот new.
Скажите, это поведение нормально? Оно гдето описано?
Re: Перегрузка глобального оператор new, есть вопросы...
От: template  
Дата: 04.05.03 13:23
Оценка:
Здравствуйте, 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, есть вопросы...
От: Андрей Тарасевич Беларусь  
Дата: 04.05.03 14:26
Оценка: 9 (1)
Здравствуйте, mihapro, Вы писали:

M>Разьясните мне такое поведение компилятора:

M>Есть проект, в нём используется выделение памяти через new.
M>Делаю ещё один файл cpp. Пишу в нём перегрузку оператора new. Заголовочного файла не делаю. Этот файл просто компилится. И после ребуидла уже все вызовы new залинкованы на это переопределение.
M>Мне непонятно то, что здесь нет явного объявления этой функции в других исходниках. Компилятор сам решил все вызовы перестроить на этот new.
M>Скажите, это поведение нормально? Оно гдето описано?

Явное объявление этой функции располагается в заголовочных файлах стандартной библиотеки. Когда ты предоставляешь свою реализацию функции '::operator new', ты не перегружаешь стандартную реализацию (как обычно выражаются), а замещаешь ее.
Best regards,
Андрей Тарасевич
Re[2]: Перегрузка глобального оператор new, есть вопросы...
От: mihapro Россия  
Дата: 05.05.03 06:38
Оценка:
Здравствуйте, template, Вы писали:

T>Оператор это же такая же функция. Мы же можем вызвать функцию определенную в

T>другом файле, если она только не объявлена с модификатором static.

T>Определение (набор параметров) оператора new стандартизировано. Поэтому никаких заголовочных файлов не нужно.


T>Если в проекте оператор new не определен он берется из стандартной библиотеки.


T>Если Вы хотите использовать new только в одном файле поставьте перед ним static.


Спасибо за ответ. Картина более менее прояснилась. Я просто изначально считал, что глобально переопределив new я могу вызвать в нужный мне момент стандартный.
Re[2]: Перегрузка глобального оператор new, есть вопросы...
От: mihapro Россия  
Дата: 05.05.03 06:43
Оценка:
Здравствуйте, Андрей Тарасевич, Вы писали:

АТ>Явное объявление этой функции располагается в заголовочных файлах стандартной библиотеки. Когда ты предоставляешь свою реализацию функции '::operator new', ты не перегружаешь стандартную реализацию (как обычно выражаются), а замещаешь ее.


Механизм понятен. Андрей, не могли бы меня направить в нужный раздел MSDN, про замещение почитать?
Re[3]: Перегрузка глобального оператор new, есть вопросы...
От: Андрей Тарасевич Беларусь  
Дата: 05.05.03 07:55
Оценка:
Здравствуйте, mihapro, Вы писали:

АТ>Явное объявление этой функции располагается в заголовочных файлах стандартной библиотеки. Когда ты предоставляешь свою реализацию функции '::operator new', ты не перегружаешь стандартную реализацию (как обычно выражаются), а замещаешь ее.


M>Механизм понятен. Андрей, не могли бы меня направить в нужный раздел MSDN, про замещение почитать?


В MSDN про такие тонкости не пишут. Скорее всего MSDN будет использовать термин "перегрузка" по отношению к замещению '::operator new'. Может лучше на эту тему Страуструпа почитать?
Best regards,
Андрей Тарасевич
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.