Необработанное исключение в 0x00423e3b в memory_manager.exe: 0xC0000005:
Место чтения нарушения доступа 0x00000004.
Соус-файл Скачать: http://www.cppblog.com/Files/mymsdn/memory_manager_bug_vs2008_debug.zip
Привет,
Я пытаюсь создать функцию менеджера памяти для решения некоторых проблем:
- Ссылка подсчитать новый / удалить счетчик при выделении памяти для
проанализировать проблему утечки памяти.
- уменьшить фрагмент памяти.
Я написал класс memory_manager для управления выделением и
освободить блок памяти.
интерфейс:
void *allocate(size_t size);
BOOL deallocate(void * ptr);
// ...
Я пытаюсь создать новое место размещения, чтобы заменить новое из
система, поэтому я добавляю код ниже, чтобы сделать это.
#ifdef _DEBUG
static memory_manager mm;
inline void * __cdecl operator new(unsigned int size,
const char *file, int line)
{
void * res;
if((res = mm.allocate(size)) == 0)
{
// go to default allocator
}
return res;
};
inline void __cdecl operator delete(void *p)
{
if(!mm.deallocate(p))
return;
};
inline void __cdecl operator delete[]( void * p )
{
if(!mm.deallocate(p))
return;
};
#endif
#ifdef _DEBUG
#define DEBUG_NEW new(__FILE__, __LINE__)
#else
#define DEBUG_NEW new
#endif
#define new DEBUG_NEW
Но я столкнулся с исключением во время выполнения, "Необработанное исключение в
0x00423e3b в memory_manager.exe: 0xC0000005: чтение о нарушении доступа
местоположение 0x00000004. ".
Мой код memory_manager использовал код STL для управления моим менеджером
структур.
Я отлаживаю свой код и вхожу в код STL, я обнаружил, что он использует CRT
malloc для выделения памяти после деконструкции статической переменной
"memory_manager mm", система выдает необработанное исключение.
Вопросы:
Я не знаю, как улучшить свой код, чтобы использовать новое / замененное размещение
новый для моего кода?
Я не знаю, что произошло в деконструкции статической переменной?
Не знаю, есть ли лучший способ решить мои проблемы в
начало этого поста?
У меня есть мысли о создании shared_ptr для решения этой проблемы, может быть
как это:
shared_ptr sp_(new MyClass);
// inner of shared_ptr:
// 1. new MyClass use the system allocator to assign memory.
// 2. In the constructor of the shared_ptr:
// 2.1 copy the memroy of the (new MyClass) object into our memory:
// static memory_manager mm;
// void * p = mm.allocate(sizeof obj);
// memmove( from obj to p);
// delete obj;
// return p;
// 3. Is it right?
// 4. if it's a array, like new MyClass[10]; we must delete the object
как это удалить [] obj? Как это отличить?
Спасибо!