发布日期:2018-03-26
如何在C++代码/项目中找到内存泄漏的原因?+ 查看更多
如何在C++代码/项目中找到内存泄漏的原因?
+ 查看更多
发布日期:2018-02-26 14:03
分类:CPlusPlus
浏览次数:72
我是Windows平台上的C ++程序员。 我使用Visual Studio 2008。通常我通过检查代码的方式找到内存泄漏,但这十分繁琐,并不总是一个好的方法。由于我买不起付费的内存泄漏检测工具,所以我希望你们能提供一个最佳的避免内存泄漏的方法。
我想知道程序员如何找到内存泄漏。
是否有一些程序员应该遵循的标准或规程来确保程序中没有内存泄漏。
是否有一些程序员应该遵循的标准或规程来确保程序中没有内存泄漏。
回答
说明你需要的东西:
熟练掌握C ++
C ++编译器
调试器和其他调查软件工具
C ++编译器
调试器和其他调查软件工具
1
理解基本的操作符。C++操作符“new”分配堆内存。 “delete”操作符释放堆内存。对于每个“new”关键字,你应该对应使用“delete”,以便释放您分配的相同的内存:
char* str = new char [30]; // 分配30个字节来存放字符串. delete [] str; // 清除这30个字节,并且将str指向空.
2
只有在您删除后才会重新分配内存。在下面的代码中,str通过第二次赋值获取了一个新地址。第一个地址就不可恢复性地丢失了,它指向的30个字节也是如此。现在他们无法被释放,导致你的代码中有了一个内存泄漏:
char* str = new char [30]; // 给str一个内存地址 // delete [] str; // 删除此行中的第一个注释标记以进行更正. str = new char [60]; /* 在第一个内存地址会永远丢失的情况下给它赋值为另一个内存地址.*/ delete [] str; // 这将会释放60字节的内容而不是第一个30字节的内容.
3
注意那些指针的分配。每个动态变量(堆上分配的内存)需要与一个指针相关联。当动态变量与其指针分离时,就不可能被擦除。同样,这会导致内存泄漏:
char* str1 = new char [30]; char* str2 = new char [40]; strcpy(str1, "Memory leak"); str2 = str1; // 这是糟糕的!现在40字节是不可能被释放的. delete [] str2; // 这释放了30字节. delete [] str1; // 可能产生访问冲突,这是一个灾难!
4
小心局部指针。在函数中声明的指针在堆栈上分配,但它指向的动态变量在堆上分配。如果不删除它,它将在程序退出函数后持续存在:
void Leak(int x){ char* p = new char [x]; // delete [] p; // 删除此行中的第一个注释标记以进行更正. }
5
注意“delete”操作符后的方括号。单独使用“delete”操作符释放单个对象,使用带有方括号的“delete[]”的操作符来释放堆数组。不要像下面这样做:
char* one = new char; delete [] one; // 这是错误的! char* many = new char [30]; delete many; // 这是错误的!
6
如果还存在泄漏 - 我通常寻求deleaker得到相关的帮助(从这里查找:http://deleaker.com)。
谢谢!