2012-05-20 88 views
2

我目前正在處理我自己的內存泄漏跟蹤系統。C++新建,刪除,新建[]和刪除[]

我正在使用Microsoft Visual C++ 2008,我知道他們有一個內置的,但我一直爲自己做一個,只是爲了它的樂趣。但是,當我重寫新的和新的[]命令時,無論我做什麼,都會出現函數重定義錯誤。我不太瞭解有關Microsoft Visual C++內部綁定的東西,但是我聽說它與CRT已經定義了完全相同的宏。

我看過這裏和其他地方的文章,針對這個相同的確切問題,但 人們似乎永遠不會解決問題或永遠不會給出他們如何解決它的問題的確切答案。

這裏是我的全部了,直到此時代碼:

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

所有的代碼是鬆散的基礎掀起了老flipcode文章(如何檢測內存泄漏)。 對不起,我不能給你一個直接的鏈接,因爲我沒有10個代表發佈超過2個超鏈接。

謝謝你的時間。

+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-operators) –

回答

2

「函數重定義錯誤」很可能是因爲你’重新使用MFC。

運行時庫不應該定義這種分配和釋放函數。

當前代碼’小號

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

是解精。不能保證一個unsigned int足夠大以容納一個地址,即使它位於32位Windows中。相反,請使用intptr_t

此外,當前的代碼’小號

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

是解精。這應該是…

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

而且您需要相應的operator delete,就像…

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

,以便從失敗的構造函數調用釋放內存。這只是在非常具體的情況下才被調用。但是如果你沒有它,那麼你就有漏洞,就像MFC曾經進行調試構建一樣。


編輯:你現在提供的代碼的固定版本:

文件[微乎其微。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你’在下面的代碼重新造成new關鍵字破壞。
  • 在C中,你絕對不應該使用malloc的結果,而在C++中,你只能在需要的時候施放任何東西。這裏沒有這種需要。只投射面具錯誤,這不是一個好主意。
  • 錯誤情況下丟失返回。對於您需要的錯誤throw std::bad_alloc。這是由聖潔標準’規定的這些功能。

 

#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對於一個地址來說足夠大,如果您不介意我問,爲什麼delete實際上需要行和文件輸入?我已經刪除搜索地址與「RemoveMemoryInformation」,並從STL向量中刪除它,我不使用MFC,這就是爲什麼我一直在試圖找出是什麼導致這樣的衝突。再次感謝。 – Unknown

+0

@未知:創建一個展示問題的最小但完整的示例。如果這本身不能告訴你問題是什麼,請發佈該代碼。例如將其粘貼到pastebin並在此處張貼鏈接。 –

+0

重載的展示位置刪除需要具有與相應展示位置相同的附加參數。這就是新表達式所知道的。簽名標識它。 –