Оператор перегрузки C++ new delete,

Привет, это немного сложно, поэтому, пожалуйста, дайте мне знать, если что-то из этого не имеет смысла, наша команда пишет приложение на C++, и у нас ранее был перегружен оператор new. Недавно я наткнулся на эту статью: http://www.flipcode.com/archives/How_To_Find_Memory_Leaks.shtml о том, как получить отладочную информацию с помощью нашего распределения памяти.

Все файлы в приложении #include один файл, в котором у нас есть конфигурации платформы во время компиляции, и в этом файле я добавил следующее:

#ifdef _DEBUG
void* operator new(size_t size, const char *filename, const char *funcname, int line);
void* operator new[](size_t size, const char *filename, const char *funcname, int line);
#define new new(__FILE__, __FUNCSIG__, __LINE__)
#endif

Так как мы только связываем libcmt.lib для нашей сборки платформы, чтобы использовать STL, я удалил нашу старую реализацию оператора new, которая выглядела так:

// in a .cpp file:
void*
operator new(size_t size) { ... }

и заменил его на:

// in the same .cpp file as above...
#undef new
void* operator new(size_t size, const char *filename, const char *funcname, int line) { ... }
#define new new(__FILE__, __FUNCSIG__, __LINE__)

это прекрасно работает для компиляции, но я получаю кучу ошибок компоновщика из libcmt.lib:

например: libcmt.lib(malloc.obj): ошибка LNK2001: неразрешенный внешний символ __imp_HeapAlloc

Добавление старой реализации оператора new (без дополнительных параметров) позволяет компоновщику успешно все связать.

Мой вопрос: я хочу, чтобы libcmt видел мой макрос (#define new new (FILE, FUNCSIG, LINE)) и, таким образом, когда он связывает, пытается связать определенную версию (с макросами отладки).

Как мне заставить это работать?? (Я также попытался использовать листы свойств в пределах Visual Studio для определения макроса)

1 ответ

Решение

Вы не можете заставить его работать. Если этот макрос определен в любом файле, который содержит стандартный заголовок, поведение не определено. И, конечно же, нормальная эволюция проекта приведет людей к определению operator newили используйте размещение new, или любой из множества методов, которые этот макрос сломает. Это примерно на том же уровне, что и #define while if, Переопределение ключевого слова в макросе - верный способ попасть в неприятности, даже если вы не используете стандартную библиотеку.

Другие вопросы по тегам