【发布时间】:2014-03-24 16:03:22
【问题描述】:
我知道其他几个讨论过类似问题的线程。我也知道必须解除分配所有分配的资源,并且不应该留下任何东西。我问这个问题的原因是看看是否有一种方法可以自动检测类中的内存泄漏。特别是,我正在尝试实现一种自动化方法来检测单元测试中的泄漏,以便该类的未来开发更加健壮。由于我的类在其中使用了其他几个类以及一些 DLL,因此很难(如果不是不可能的话)跟踪所有这些中的泄漏,因此这样的单元测试可能会有所帮助。
我正在考虑几种能够检查类中的内存泄漏的解决方案。假设我的课程与此类似:
class MyClass
{
MyClass() { /* Lots of allocations */ }
~MyClass() { /* Lots of deallocations */ }
}
-
在测试函数中,多次实例化类实例 并且每次都破坏。同时,检查任务管理器(在 Windows 至少)查看是否为您分配的内存 应用程序增加或基本保持平稳:
TEST( MyClass, MyClass) { int some_big_number = 10000; for (int i=0; i<some_big_number; i++) { MyClass *myC = new MyClass; delete myC; } } -
在实例化前后分配一些虚拟变量 销毁类实例并检查两个地址是否 相同。像这样的:
TEST( MyClass, MyClass) { int address_1 = 0, address_2 = 0; int *tmp_1 = new int; address_1 = tmp_1; delete tmp_1; MyClass *myC = new MyClass; delete myC; int *tmp_2 = new int; address_2 = tmp_2; delete tmp_2; EXPECT_TRUE( address_1 == address_2 ); }我的假设是,如果 MyClass 中没有内存泄漏,并且 所有声称的内存都已正确释放,地址 tmp_1 和 tmp_2 的值应该相同。我只是不确定记忆是否 分配就是这样工作的。
使用插件或程序,例如deleaker 或Valgrind,但是 这可能会使我的代码或测试过大,我不确定是否 无论如何都可以在上面的上下文中使用。
谢谢!
【问题讨论】:
-
根本无法保证 tmp_2 将获得相同的地址。这是底层分配器的实现相关细节。
-
valgrind.org怎么样
-
Also I am aware that one must deallocate all the allocated resources and nothing should be left unaccounted for使用容器和智能指针等自动完成这项工作的构造怎么样? -
在创建被测类实例之前和之后使用内存使用比较,然后在调用被测类析构函数后再次使用内存使用情况如何?通过 Internet 快速搜索发现该站点有多种平台方法来查找正在使用的内存:C/C++ tip: How to get the process resident set size - physical memory use。
-
您应该告诉我们您使用的是什么 IDE。对于 Microsoft Visual Studio 项目,请尝试 vld.codeplex.com。微软内置的检漏仪很烂。
标签: c++ unit-testing memory memory-management memory-leaks