Как уже упоминалось, ошибка наступает, потому что ваш #define new
также расширяется на operator new
.
Чтобы решить вашу проблему, я могу предложить вам попробовать следующее; это поможет вам избежать использования макросов:
//overload new with LINE & FILE and call the function inside
void* operator new (size_t size, const char *FILE, const unsigned int LINE)
{
dPushMemManFileLine(FILE, LINE);
return malloc(size);
}
//overload the default new operator and throw something vague
void* operator new (size_t size)
{
class BadNewUsed {} bad;
throw bad; // throw it; since we can't catch it at compile time
}
Использование:
int *pi = new(__LINE__, __FILE__) int; // ok
double *pd = new double; // throws BadNewUsed out of your code,
Единственное, что вам нужно сделать, это пойти и исправить вызов на new
, пока он не наберет throw
. Это также вы можете сделать это быстро с простой техникой. Просто сделай
#define new abcd // to get compilation error wherever new is present
Теперь перейдите и замените каждый вызов на new
на NEW
. Не заменяйте operator new
реализацию. Тогда сделай,
#define NEW new( __FILE__, __LINE__)
И скомпилируйте код. Обратите внимание, что этот макрос используется для вашей цели отладки и ускоряет работу. Я не рекомендую его использовать в рабочем коде.
Вы можете добиться этого, используя templates
, даже если вы не хотите использовать макросы, такие как NEW
.
template<typename T>
T* NEW (const char* FILE, const unsigned int LINE)
{
dPushMemManFileLine(FILE, LINE);
return new T; // can use default version or any overloaded version of 'new'
}
Использование:
int *p = NEW<int>(__FILE__, __LINE__);