“ функция переопределение ошибки ”, вероятно, потому, что вы ’ повторно используете 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
Вы были со ссылкой на [этой] (http://www.flipcode.com/archives/How_To_Find_Memory_Leaks.shtml) статьи? – Hindol
Действительно, я был, спасибо. – Unknown
Вы читали: [как я должен писать стандартные стандартные и удаленные операторы iso C++) (http://stackoverflow.com/questions/7194127/how-should-i-write-iso-c-standard-conformant-custom -new-and-delete-operator) –