После нескольких дней тестирования я понял, что механизм исправлений во время выполнения patch_functions.cc не безопасно использовать в производственной среде.
Кажется, он хорошо работает в проекте VS2010, за исключением HeapAlloc () и HeapFree (), но не может быть использован в проекте VS2015 из-за некоторых нерешенных проблем Открытые вопросы.
Windows readme описывает этот альтернативный способ использования tcmalloc:
Альтернативой всему вышесказанному является статическая привязка вашего приложения.
с помощью libc, а затем замените его malloc на tcmalloc. Это позволяет вам
просто собрать и связать вашу программу нормально; поддержка tcmalloc
вступает в этап постобработки. Это более надежно, чем выше
техника (которая зависит от исправлений во время выполнения, что по своей сути
хрупкий), хотя больше работы по настройке. Подробнее см.
https://groups.google.com/group/google-perftools/browse_thread/thread/41cd3710af85e57b
К сожалению, предоставленный лайк недоступен, кажется, Google закрыл группу.
Может ли кто-нибудь объяснить мне, как это сделать?
Я предполагаю, что это предлагает написать свой собственный malloc
который использует tcmalloc
,
Так что вы должны определять и свяжите свой собственный (путем создания или использования модуля перевода .c aka) и напишите что-то вроде этого
#ifdef __cplusplus
extern "C" {
#endif
#include <stdlib.h>
void* malloc(size_t size) {
return tcmalloc(size);
}
//Also define a free if memory which has been allocated by tcmalloc
//needs to be freed by a special function
// Like
/*
void free(void* ptr) {
if (ptr) {
tcfree(ptr);
}
}
*/
#ifdef __cplusplus
}
#endif
Проблема в том, что: в зависимости от вашей системы сборки или компоновщика, он может содержать двойные символы или ссылки. Тогда вы должны как-то исключить libcs malloc
или измените libc самостоятельно.
Других решений пока нет …