Arhn - архитектура программирования

перегрузка новых и удаление

Я стараюсь следовать этой статье: http://flipcode.com/archives/How_To_Find_Memory_Leaks.shtml

перегружать мои новые и удаляемые функции, чтобы отслеживать утечки памяти.

однако - если я пытаюсь скомпилировать, я получаю

C2365: «новый оператор»: переопределение; предыдущее определение было "функцией"

в файле xdebug

xdebug включается в xlocale, однако я не могу найти, где мой проект включает xlocale

Я использую MFC для многопоточности в своем проекте.

Может ли кто-нибудь сказать мне, как я могу заставить работать отслеживание утечки памяти?

//редактировать: Итак, это мой findMemoryLeak.h, который я включаю в конец stdafx.h

#ifndef _FINDMEMORYLEAK_H
#define _FINDMEMORYLEAK_H

#include <list>
using namespace std;

#ifdef _DEBUG

typedef struct {
    DWORD   address;
    DWORD   size;
    char    file[64];
    DWORD   line;
} ALLOC_INFO;

typedef list<ALLOC_INFO*> AllocList;

AllocList *allocList;

void AddTrack(DWORD addr,  DWORD asize,  const char *fname, DWORD lnum)
{
    ALLOC_INFO *info;

    if(!allocList) {
        allocList = new(AllocList);
    }

    info = new(ALLOC_INFO);
    info->address = addr;
    strncpy(info->file, fname, 63);
    info->line = lnum;
    info->size = asize;
    allocList->insert(allocList->begin(), info);
};

void RemoveTrack(DWORD addr)
{
    AllocList::iterator i;

    if(!allocList)
        return;
    for(i = allocList->begin(); i != allocList->end(); i++)
    {
        if((*i)->address == addr)
        {
            allocList->remove((*i));
            break;
        }
    }
};


void DumpUnfreed()
{
    AllocList::iterator i;
    DWORD totalSize = 0;
    char buf[1024];

    if(!allocList)
        return;

    for(i = allocList->begin(); i != allocList->end(); i++) {
        sprintf(buf, "%-50s:\t\tLINE %d,\t\tADDRESS %d\t%d unfreed\n",
            (*i)->file, (*i)->line, (*i)->address, (*i)->size);
        OutputDebugString(buf);
        totalSize += (*i)->size;
    }
    sprintf(buf, "-----------------------------------------------------------\n");
    OutputDebugString(buf);
    sprintf(buf, "Total Unfreed: %d bytes\n", totalSize);
    OutputDebugString(buf);
};


inline void * __cdecl operator new(unsigned int size, const char *file, int line)
{
    void *ptr = (void *)malloc(size);
    AddTrack((DWORD)ptr, size, file, line);
    return(ptr);
};

inline void __cdecl operator delete(void *p)
{
    RemoveTrack((DWORD)p);
    free(p);
};

inline void * __cdecl operator new[](unsigned int size, const char *file, int line)
{
    void *ptr = (void *)malloc(size);
    AddTrack((DWORD)ptr, size, file, line);
    return(ptr);
};

inline void __cdecl operator delete[](void *p)
{
    RemoveTrack((DWORD)p);
    free(p);
};
#endif

//make the normal new function call the new function with three parameters
#ifdef _DEBUG
#define DEBUG_NEW new(__FILE__, __LINE__)
#else
#define DEBUG_NEW new
#endif
#define new DEBUG_NEW


#endif

когда я включаю его вот так в конец stdafx.h, я получаю тысячи ошибок компилятора, большинство из них либо в xdebug, либо в xlocale, причем первый из них

C2365: «новый оператор»: переопределение; предыдущее определение было "функцией"

в xdebug в строке 32


  • В простой сборке командной строки это работает. Так что я предполагаю, что это либо проблема с MFC, которая делает именно то, что вы делаете, либо это работает по-другому в vc2010. 06.12.2009
  • Хорошо, я отказываюсь от этого. Кажется, действительно проблематично перезаписать глобальные новые и удалить в проекте MFC. Итак, я пытаюсь использовать функции memoryDumping MFC, но они также не работают в моем случае должным образом - хотя я задам другой вопрос для этого. Спасибо 06.12.2009
  • Мы успешно перегружаем глобальное новое/удаление в нашем проекте MFC... это возможно с небольшим выпадением волос. Вам нужно найти объектный файл в библиотеке MFC, который содержит перегруженные функции, а затем удалить этот объектный файл с помощью lib.exe, а затем убедиться, что вы перегружаете новый/удаляете в своем проекте и определяете все символы, которые были определены в объекте, который вы удален из библиотеки. 13.02.2014

Ответы:


1

Я решил это некоторое время назад.

Что происходит, так это то, что слово new является макросом к тому времени, когда вы доберетесь до своих перегрузок (конечно, это не решило наши проблемы с связыванием), но попробуйте добавить:

#undef new

после последней директивы include в вашем файле, но до первой перегрузки new.

редактировать

Это происходит потому, что stdafx.h (или что-то еще включает в себя файл, который определяет DEBUG_NEW) включается до того, как вы включаете свой код обнаружения утечки памяти в какой-либо файл CPP (вы должны быть в состоянии выяснить, какой из ошибок компилятора). Таким образом, new был определен как макрос, который заставляет ваш компилятор блевать при определении.

12.08.2013

2

чтобы найти, где включается xlocale. просто измените имя xlocale на другое. попробуй скомпилировать и увидишь где не получится

06.12.2009

3

В Visual Studio отладочные сборки программ уже используют «кучу отладки», поэтому вам не нужны собственные инструменты.

Используя функции отладки вашей платформы, вы можете, например, вызвать _CrtDumpMemoryLeaks в конце вашей программы, фактически не перегружая все.

06.12.2009
  • Привет и спасибо за ответ! Но описанные в статье перегруженные методы гораздо лучше. _CrtDumpMemoryLeaks просто возвращает true, если произошла утечка памяти, используя технику, описанную в статье, можно точно определить, какие выделения не освобождаются снова, в каком файле, на какой строке. есть ли также функция _Crt, которая делает это? если нет, как я могу заставить работать свои собственные переопределенные функции создания/удаления? 06.12.2009
  • Информация об утечке выводится в stderr, поэтому вы увидите ее в Visual Studio. Он также находит утечки, которые вызваны не только новостями и удалениями объектов, например, отсутствием управления ресурсами c-API win32 и т.п. 06.12.2009
  • Спасибо еще раз! Но это выводит сотни тысяч строк, таких как обычный блок {692972} по адресу 0x038A1480, длиной 12 байт. Данные: ‹ H › 80 14 8A 03 48 0A 8A 03 B0 86 E0 02. Это бесполезно для меня.. все, что я хочу знать, это то, какую строку моего кода я называю «новой», которая не удаляется позже 06.12.2009
  • Вы не знаете, что это объект, выделенный «новым». Что вы можете сделать, так это установить хуки для malloc/realloc/free; это поймает все ваши аллоки, но не те, которые вы вызываете внутри библиотек. 06.12.2009
  • В Linux Valgrind был бы как нельзя кстати! В мире Windows Purify является коммерческим аналогом. 06.12.2009
  • Не видя вашего кода, я не могу сказать, есть ли у вас простая синтаксическая ошибка или два дуэльных определения. Вы можете попробовать использовать /E для получения вывода препроцессора, чтобы увидеть, нашли ли вы каким-то образом определение в файле заголовка. Вы можете опубликовать свой фактический код ... Другими словами, ДА, ВЫ МОЖЕТЕ заставить эту работу работать, но вы не разместили достаточно информации, чтобы разобраться в своей проблеме. 06.12.2009
  • В конце я добавил код, который я включил в свой stdafx.h - на самом деле это точно такой же код, как описано в статье. 06.12.2009

  • 4

    Вы определяете ту же самую перегрузку, которую Microsoft определяет для своей отладки, и запускаете их. Я рекомендую добавить в ваш оператор дополнительный фиктивный параметр.

    Я также рекомендую отладить это not в stdafx.h, прежде чем помещать его туда.

    06.12.2009

    5

    Попытка отлаживать таким образом с помощью std lib на самом деле не сработает. Он не поймает все (или какое-либо) выделение памяти. Это всего лишь одна из миллиона причин не использовать std lib, stl или boost.

    07.12.2009
    Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..