在非托管C/C++代码中,检测内存泄漏的最佳实践是什么?和编码指南,以避免?(好像就这么简单;)
过去我们使用了一些愚蠢的方法:每次内存分配调用都有一个计数器增量,而在释放时减少.在程序结束时,计数器值应为零.
我知道这不是一个很好的方式,有一些捕获.(例如,如果释放由平台API调用分配的内存,则分配计数将与您的释放计数不完全匹配.当然,我们在调用分配内存的API调用时递增计数器.)
我期待您的经验,建议和一些简化此工具的工具参考.
所以我有这段简单的代码,演示了一个简单的缓冲区溢出:
#include <stdio.h>
int main(void)
{
char c[4] = { 'A', 'B', 'C', 'D' };
char d[4] = { 'W', 'X', 'Y', 'Z' };
printf("c[0] is '%c'\n", c[0]);
d[4] = 'Z'; /* Overflow that overwrites c[0] */
printf("c[0] is '%c'\n", c[0]);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出:
$ ./a.out
c[0] is 'A'
c[0] is 'Z'
Run Code Online (Sandbox Code Playgroud)
我尝试使用以下gcc选项编译此代码,并使用飞行颜色传递:
gcc -Wall -Wextra -Wformat=2 -Wswitch-default -Wcast-align -Wpointer-arith \
-Wbad-function-cast -Wstrict-prototypes -Winline -Wundef -Wnested-externs \
-Wcast-qual -Wshadow -Wwrite-strings -Wconversion -Wunreachable-code \
-Wstrict-aliasing=2 -ffloat-store -fno-common -fstrict-aliasing \
-Wstack-protector …Run Code Online (Sandbox Code Playgroud) 我正在验证用c ++编写的带有内存泄漏的应用程序,并且需要一个实用程序(免费软件),我可以轻松地运行以检测它在哪里发生.有任何想法吗?