- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我知道其他几个讨论了类似问题的线程。我也知道必须取消分配所有已分配的资源,并且不应遗留任何 Unresolved 问题。我问这个问题的原因是看看是否有一种方法可以自动检测类中的内存泄漏。特别是,我正在尝试实现一种自动化的方法来检测单元测试中的泄漏,以便该类的 future 开发更加健壮。由于我的类(class)在其中使用了其他几个类(class)以及一些 DLL,因此即使不是不可能,也很难跟踪所有这些类(class)中的泄漏,因此这样的单元测试可能会有所帮助。
我正在考虑一些能够检查类内内存泄漏的解决方案。假设我的类(class)与此类似:
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 , 但这可能会使我的代码或测试变得不利,我不确定是否无论如何都可以在上面的上下文中使用。
谢谢!
最佳答案
@galop1n 是正确的,无论您是如何一般处理泄漏的。
但是您确实触及了一个有效的点,即 DLL 内存管理。您会看到 DLL 中的对象需要以不同方式处理内存。您将内存管理委托(delegate)给您的库的某个点。在你的库中,内存将按照它们定义的顺序分配。他们将提供释放此内存的方法(例如 CUDA 库
中的 cudaFree
)。
您应该在对象的构造函数和析构函数中处理您的内存。 C++
标准提供了一些很好的机制来为您处理内存。 unique_ptr
和 shared_ptr
是 C++11
中的一个很好的例子,您还可以使用 std
中的容器> 为了同样的目的。
Valgrind也是一个很好的工具,一旦你已经完成了上面提到的所有事情。一旦您使用了 C++
提供的所有可能的工具,就该使用这个很棒的工具仔细检查您的内存使用情况
关于c++ - 如何检查 C++ 类中的内存泄漏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22614525/
我需要根据需要动态设置文本区域,但它不想正常工作。 JQuery 会自行检查,但无法检查是否已检查。但是当您在第二个单选框内单击时,始终需要文本区域。我尝试了很多次让它工作,但它仍然有问题。我添加了“
我需要在 Django 中进行 API 调用(某种形式),作为我们所需的自定义身份验证系统的一部分。用户名和密码通过 SSL 发送到特定 URL(对这些参数使用 GET),响应应该是 HTTP 200
我将在我的可移植 C 代码中使用 #warning 来生成编译时警告。但并非所有平台都支持 #warning。有什么方法可以找到该平台是否支持 #warning。 #ifdef warning
我编写了一个函数来检查某个数字是否存在于某个区间内。停止搜索的最佳方法是什么?这个: for (i = a; i <= b; i++) { fi = f(i); if (fi == c) {
我想知道在 c 中是否有一种方法可以检查,例如在 for 函数中,如果变量等于或不等于某些字符,而不必每次都重复进行相等性检查。如果我没记错的话,以这种方式检查相等性是不正确的: if (a == (
我有如下日志功能 void log_error(char * file_name, int line_num, int err_code) { printf("%s:%d:%s\n", fil
使用 ssh-keygen 生成的 key 对在 macOS 上可以有不同的格式。 macOS 可读的标准 PEM ASN.1 对象 SecKey API 带有文本标题的 PEM OpenSSH ke
我正在尝试编写一个 excel if 语句。我不熟悉使用 Excel 具有的所有额外功能。我正在使用一个名为 importXML() 的函数.我正在尝试检查我正在使用的函数是否生成“#VALUE!”错
有没有办法检查是否没有 AIO 写入给定文件?我在我的 Unix 类(class)上制作了一个项目,该项目将是一个上下文无关(基于 UDP)的国际象棋服务器,并且所有数据都必须存储在文件中。应用程序将
我有一个如下所示的函数: public Status execute() { Status status = doSomething(); if (status != Stat
我正在使用 Composer,我不希望 PhpStorm 在 vendor 文件夹上运行任何错误检查或检查,因为它对 vendor/中的某些代码显示误报composer/autoload_static
Chapel 的一个很好的特性是它区分了数组的域和它的分布。检查两个数组是否具有相同的域和分布(通常想要的)的最佳方法是什么? 我能看到的最好的方法是检查 D1==D2和 D1.dist==D2.di
在我的 JavaScript 函数中,我为所有输入、文本区域和选择字段提供实际值作为 initial_value: $('input, textarea, select').each(function
我正在编写一个分解为几个简单函数的 PHP 类。在构造函数中,它调用另一个名为 processFile 的函数。该函数调用 5 个私有(private)函数并进行检查。如果检查失败,它会将消息分配给
这个问题已经有答案了: How to detect if user it trying to open a link in a new tab? (2 个回答) 已关闭 7 年前。 我认为 JavaS
我正在浏览我们的代码库并看到很多这样的测试: declare @row_id int = ... declare @row_attribute string select @row_attribu
我正在声明一个用作比较的函数。我的问题是: 为什么条件充当语句? 为什么第 4 行可以工作,而第 5 行却不行? 我知道这段代码不切实际且未使用,但为什么编译器允许这种语法? 谷歌没有找到答案。但话又
到目前为止,我有一个带有空文本字段的 PHP Kontaktform,并使用以下命令检查了所需的字段: $name = check_input($_POST['name'], "请输入姓名。"); 现
目前,我能想到的合理检查的唯一方法没有臃肿的逻辑: if ( $value > 0 ) { // Okay } else { // Not Okay } 有没有更好的办法? 最佳答案
我正在尝试运行一个脚本,如果 i 存在(意味着存在 i 值,任何值)或其他部分,我希望运行其中的一部分如果i没有值就运行,有人可以启发我吗? 我说的是 for 循环,比如 for (var i=0;
我是一名优秀的程序员,十分优秀!