在非托管C/C++代码中,检测内存泄漏的最佳实践是什么?和编码指南,以避免?(好像就这么简单;)
过去我们使用了一些愚蠢的方法:每次内存分配调用都有一个计数器增量,而在释放时减少.在程序结束时,计数器值应为零.
我知道这不是一个很好的方式,有一些捕获.(例如,如果释放由平台API调用分配的内存,则分配计数将与您的释放计数不完全匹配.当然,我们在调用分配内存的API调用时递增计数器.)
我期待您的经验,建议和一些简化此工具的工具参考.
显然,维基百科有关于该主题的大量信息,但我想确保我理解.从我可以告诉它的重要性来理解堆栈/堆关系真正了解内存泄漏?
所以这就是我(我想)的理解.更正是非常受欢迎的!
首次启动程序时,会分配一块内存,例如0x000到0xFFF.第一部分(比如0x000到0x011)是加载程序代码的代码/文本段.
+--------------+ 0x011
| Program Code |
+--------------+ 0x000
Run Code Online (Sandbox Code Playgroud)
然后你有堆栈(比如0x012到0x7ff)保存局部变量,它们被存储/检索FIFO.所以,如果你有类似的东西
char middleLetter(string word){
int len = word.length();
return word[len/2];
}
int main(){
int cool_number;
char letter;
letter = middleLetter("Words");
...
Run Code Online (Sandbox Code Playgroud)
然后你的变量将被分配在堆栈上,如下所示:
+-------------+ 0x7ff
| |
| |
| |
| ... |
| len |
| letter |
| cool_number |
+-------------+ 0x012
Run Code Online (Sandbox Code Playgroud)
当然,如果你在某处(使用malloc或new)分配内存,但从不释放它,那么你的堆可能看起来像这样,你现在有内存泄漏:
+-------------+ 0xfff
| |
| malloc(20) | 0xf64
| malloc(50) | 0xf32
| malloc(50) | 0xf00
| ... …Run Code Online (Sandbox Code Playgroud)