Как использовать перегруженный новый оператор, используемый в пространстве имен QT - PullRequest
0 голосов
/ 30 ноября 2011

Я пишу приложение на C ++, которое использует библиотеки QT.Я хочу обнаружить утечки памяти в моем приложении и в QT.Итак, я перегрузил оператор new и delete в моем main.cpp, используя эту ссылку http://lists.trolltech.com/qt-interest/2002-04/msg00933.html,, но QT не использует перегруженные операторы.Судя по всему, это проблема с пространством имен.Как решить эту проблему.

int numAllocUnits = 0;
ofstream myLogFile("/root/memLeak.log");

class MemoryLeak_Manav
{
public:
        MemoryLeak_Manav() {
        if (!myLogFile.is_open()) {
                cout << "Unable to open file";
        }
        myLogFile << "Memory Leak Detection log File" << endl;
        printf("Memory Leak Detection On ... ");
        }

public:
        ~MemoryLeak_Manav() {
        myLogFile.close();
        if(numAllocUnits)
                printf("\nError: Memory leak detected: %d\n\n", numAllocUnits);
        else printf("\nNo memory leak detected.\n\n");
        }

public:
   void *operator new [] (size_t size);
   void *operator new (size_t size);
   void operator delete [] (void *p);
   void operator delete (void *p);
};

void * MemoryLeak_Manav::operator new(size_t size)
{
  void *newPtr;
  numAllocUnits++;
  newPtr = malloc(size);
  printf("malloc [%p allocated %d bytes]\n", newPtr, size);
  myLogFile << "malloc [" << newPtr << "allocated" << size << "bytes" << endl;
  return newPtr;
}

void  MemoryLeak_Manav::operator delete(void *p)
{
  numAllocUnits--;
  free(p);
}

void * MemoryLeak_Manav::operator new [] (size_t size)
{
  void *newPtr;
  numAllocUnits++;
  newPtr = malloc(size);
  printf("malloc [%p allocated %d bytes]\n", newPtr, size);
  myLogFile << "malloc [" << newPtr << "allocated" << size << "bytes" << endl;
  return newPtr;
}

void  MemoryLeak_Manav::operator delete [] (void *p)
{
  numAllocUnits--;
  printf("free %p\n", p);
  myLogFile << "free" << p << endl;
  free(p);
}

Файл memLeak.log пуст, и я не вижу сообщений printf также.

Ответы [ 3 ]

2 голосов
/ 30 ноября 2011

Вы не можете перегрузить new в библиотеке, поскольку библиотека уже скомпилирована.Чтобы заменить new в Qt, вы должны получить источники Qt, поместить перегрузку в любой их базовый файл и затем перекомпилировать.Кстати, это не так сложно, как кажется.

0 голосов
/ 30 ноября 2011

Если вы можете протестировать его в Linux, взгляните на использование инструмента Valgrind Memcheck .

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

0 голосов
/ 30 ноября 2011

Вы сделали своих операторов членами класса.Таким образом, они будут использоваться только в пространстве имен класса.

Просто определите операторы как глобальные операторы (без класса), и это должно работать

...