Перегрузка нового/удалить
Я делаю небольшой поиск утечки памяти в своей программе, но
мой способ перегрузить новые и удалить (а также новые [] и удалить [])
ничего не делает.
void* operator new (unsigned int size, const char* filename, int line)
{
void* ptr = new void[size];
memleakfinder.AddTrack(ptr,size,filename,line);
return ptr;
}
То, как я перегрузил new
, показан в приведенном выше фрагменте кода. Я думаю, что-то с оператором, возвращающим void *, но я не знаю, что с этим делать.
Ответы
Ответ 1
void* ptr = new void[size];
Не могу этого сделать. Исправьте его.
Никогда не пытайтесь перегрузить новый/удалить глобально. Либо укажите их в базовом классе и выведите все объекты из этого класса, либо используйте пространство имен или параметр-распределитель шаблона. Почему, спросите вы. Потому что, если ваша программа больше одного файла и использует STL или другие библиотеки, вы собираетесь испортить.
Здесь дистиллированная версия оператора new
из VS2005 new.cpp
:
void * operator new(size_t size) _THROW1(_STD bad_alloc)
{ // try to allocate size bytes
void *p;
while ((p = malloc(size)) == 0)
if (_callnewh(size) == 0)
{ // report no memory
static const std::bad_alloc nomem;
_RAISE(nomem);
}
return (p);
}
Ответ 2
RE:
Никогда не пытайтесь перегрузить новый/удалить глобально
Почему каждый раз, когда кто-то пытается использовать менее распространенную функцию С++, кто-то действует так, как это никогда не должно быть сделано?
Это делалось все время, это довольно часто, и я не работал в компании, которая этого не делала.
Глобально перегруженные новые и удаленные приложения чрезвычайно полезны для отслеживания памяти, ошибок памяти, переполнения буфера и т.д.
Никто в здравом уме не собирается проходить через программу с несколькими миллионами строк кода и добавляет новый и удаляемый элемент к каждому классу. Это просто глупо.
Ответ 3
Возможно, вы можете сделать то, что хотите, с малой препроцессорной магией:
#include <iostream>
using namespace std;
void* operator new (size_t size, const char* filename, int line) {
void* ptr = new char[size];
cout << "size = " << size << " filename = " << filename << " line = " << line << endl;
return ptr;
}
#define new new(__FILE__, __LINE__)
int main() {
int* x = new int;
}
Ответ 4
Я думаю, что проблема здесь в том, что ваш новый профиль параметров не соответствует стандартным новым операционным операторам, поэтому он не скрывается (и, тем самым, все еще используется).
Профили параметров для новых и удаления должны выглядеть так:
void* operator new(size_t);
void operator delete(void*, size_t);
Ответ 5
Вы вызываете перегруженный оператор правильно, т.е. передаете ему дополнительные параметры?
Ответ 6
Проблема связана с двумя аргументами, которые вы добавили к перегруженному новому оператору. Попробуйте сделать имя файла и строку глобальным в некотором роде (или переменные-члены, если вы перегружаете новые и удаляете для одного класса). Это должно работать лучше.