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;
}
...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.