2012-05-20 4 views
2

В настоящее время я работаю над собственной системой отслеживания утечки памяти.C++ new, delete, new [] and delete []

Я использую Microsoft Visual C++ 2008, и я знаю, что у них есть встроенный в один, но я делал это для себя, просто для удовольствия.

Однако, когда я переопределяю новые и новые команды [], я получаю ошибку переопределения функции, независимо от того, что я делаю.

Я мало знаю о внутренних привязках Microsoft Visual C++ к вещам, но я слышал, что это то, что CRT уже определяет тот же самый макрос, который я есть.

Я видел статьи здесь и в других местах, адресованных этому же точному вопросу, но люди, похоже, никогда не могут решить проблему или никогда не дают определенного ответа о том, как они решили это.

Вот весь код, у меня есть до до этого момента:

MLD.h: http://pastebin.com/SfHzNaeN MLD.cpp: http://pastebin.com/aRhsTZpv

Всего кода навеяна покинуть старое flipcode статьи (Как Обнаружение утечек памяти). Извините, я не могу дать вам прямую ссылку, потому что у меня нет 10 rep, чтобы разместить более двух гиперссылок.

Спасибо за ваше время.

+0

Вы были со ссылкой на [этой] (http://www.flipcode.com/archives/How_To_Find_Memory_Leaks.shtml) статьи? – Hindol

+0

Действительно, я был, спасибо. – Unknown

+0

Вы читали: [как я должен писать стандартные стандартные и удаленные операторы iso C++) (http://stackoverflow.com/questions/7194127/how-should-i-write-iso-c-standard-conformant-custom -new-and-delete-operator) –

ответ

2

“ функция переопределение ошибки ”, вероятно, потому, что вы ’ повторно используете MFC.

Библиотека времени выполнения не должна заниматься определением таких функций распределения и освобождения.

текущий код ’ с

struct MemLeakInfo 
{ 
     unsigned int addr; 
     unsigned int line; 
     unsigned int size; 
     unsigned char file; 
}; 

является ungood. unsigned int не может быть достаточно большим для хранения адреса, даже если он находится в 32-разрядной Windows. Вместо этого используйте intptr_t.

Кроме того, текущий код ’ с

void* operator new(unsigned int Size, int Line, const char* File); 

является ungood. Это должно быть & hellip;

void* operator new(size_t Size, int Line, const char* File); 

И вам нужно соответствующее operator delete, как и hellip;

void* operator delete(void* p, int Line, const char* File); 

, чтобы освободить память от отказавшего вызова конструктора. Это называется только в этой конкретной ситуации. Но если у вас есть ’ t, у вас есть утечка, поскольку MFC когда-то была для отладочных сборников.


EDIT: фиксированные версии кода теперь при условии:

файл [минимальные.h]:

  • _MINIMAL_H недействителен, так как начинается с подчеркивания, за которым следует заглавная буква, которая зарезервирована. Изменено на MINIMAL_H.
  • для использования size_t вам необходимо включить <stddef.h>.
  • _DEBUG не является стандартным макросом. это микрософт. стандартный макрос (поиск документации assert) для этой цели - NDEBUG.

 

#ifndef MINIMAL_H 
#define MINIMAL_H 

#include <stddef.h>  // std::size_t 

#ifndef NDEBUG 

void* operator new(size_t Size, int Line, const char* File); 
void* operator new[](size_t Size, int Line, const char* File); 

void operator delete(void* ptr, int Line, const char* File); 
void operator delete[](void* ptr, int Line, const char* File); 

#endif 

#ifndef NDEBUG 

#define DEBUG_NEW new(__LINE__, __FILE__) 

#else 

#define DEBUG_NEW new 

#endif 

#endif //MINIMAL_H 

файл [minimal.cpp]:

  • использовать malloc Вам необходимо включить stdlib.h.
  • когда вы #define new вы ’ re wreaking havoc с ключевыми словами new в следующем коде.
  • в C вы никогда не должны приводить результат malloc, а на C++ вы должны только бросать что-то, когда есть необходимость в нем. здесь нет такой необходимости. бросает только маскирующие ошибки, и это не очень хорошая идея.
  • отсутствует возвращение в случае ошибки. для ошибки вам нужно throw std::bad_alloc. это по святому стандарту ’ s указание этих функций.

 

#include "Minimal.h" 

//#define new DEBUG_NEW 

#ifndef NDEBUG 
#include <stdlib.h>  // malloc 
#include <exception> // std::bad_alloc 

void* operator new(size_t const size, int, const char*) 
{ 
    void* const ptr = malloc(size); 

    if(!ptr) { throw std::bad_alloc(); } 
    return ptr; 
}; 

void* operator new[](size_t const size, int, const char*) 
{ 
    void* const ptr = malloc(size); 

    if(!ptr) { throw std::bad_alloc(); } 
    return ptr; 
} 

void operator delete(void* const ptr, int, const char*) 
{ 
    free(ptr); 
}; 

void operator delete[](void* const ptr, int, const char*) 
{ 
    free(ptr); 
}; 

#endif 
+0

Спасибо за дополнительную информацию, я предположил, что unsigned int будет достаточно большим для адреса, и если вы не возражаете, я спрашиваю, почему удаление действительно требует ввода строки и файла? Я удалил поиск адреса с помощью «RemoveMemoryInformation» и удалив его из вектора STL, и я не использую MFC, поэтому я пытался выяснить, что вызывает такое столкновение. Еще раз спасибо. – Unknown

+0

@ Не известно: создайте минимальный, но полный пример, который показывает проблему. если это само по себе не говорит вам, в чем проблема, отправьте этот код. например вставьте его на pastebin и отправьте ссылку здесь. –

+0

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

Смежные вопросы