Оператор перегрузки 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
, Переопределение ключевого слова в макросе - верный способ попасть в неприятности, даже если вы не используете стандартную библиотеку.