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

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

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

6 ответов

Решение
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);
}

RE:

Никогда не пытайтесь перегрузить новое / удалить глобально

Почему всякий раз, когда кто-то пытается использовать менее распространенную функцию C++, кто-то действует так, как будто этого никогда не следует делать?

Это делается все время, это довольно часто, и я не работал в компании, которая этого не делала.

Глобально перегруженные new и delete чрезвычайно полезны для отслеживания памяти, ошибок памяти, переполнения буфера и т. Д.

Никто в здравом уме не собирается проходить программу с несколькими миллионами строк кода и добавлять новый и удаляемый член в каждый класс. Это просто глупо.

Может быть, вы можете делать то, что вы хотите с небольшим количеством магии препроцессора:

#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;
}

Я думаю, что проблема здесь в том, что профиль параметров вашего нового не совпадает с профилем стандартного оператора new, поэтому он не скрывается (и, следовательно, все еще используется).

Ваши профили параметров для новых и удаленных должны выглядеть следующим образом:

void* operator new(size_t);
void operator delete(void*, size_t);

Правильно ли вы вызываете перегруженный оператор, т.е. передаете ему дополнительные параметры?

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

Другие вопросы по тегам