Подтвердить что ты не робот

Перегрузка нового/удалить

Я делаю небольшой поиск утечки памяти в своей программе, но мой способ перегрузить новые и удалить (а также новые [] и удалить []) ничего не делает.

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 *, но я не знаю, что с этим делать.

4b9b3361

Ответ 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

Проблема связана с двумя аргументами, которые вы добавили к перегруженному новому оператору. Попробуйте сделать имя файла и строку глобальным в некотором роде (или переменные-члены, если вы перегружаете новые и удаляете для одного класса). Это должно работать лучше.