gpt4 book ai didi

c++ - 如何检查 C++ 类中的内存泄漏?

转载 作者:搜寻专家 更新时间:2023-10-31 00:14:35 25 4
gpt4 key购买 nike

我知道其他几个讨论了类似问题的线程。我也知道必须取消分配所有已分配的资源,并且不应遗留任何 Unresolved 问题。我问这个问题的原因是看看是否有一种方法可以自动检测类中的内存泄漏。特别是,我正在尝试实现一种自动化的方法来检测单元测试中的泄漏,以便该类的 future 开发更加健壮。由于我的类(class)在其中使用了其他几个类(class)以及一些 DLL,因此即使不是不可能,也很难跟踪所有这些类(class)中的泄漏,因此这样的单元测试可能会有所帮助。

我正在考虑一些能够检查类内内存泄漏的解决方案。假设我的类(class)与此类似:

class MyClass
{
MyClass() { /* Lots of allocations */ }
~MyClass() { /* Lots of deallocations */ }
}
  1. 在测试函数中,多次实例化类实例每次都破坏。同时,检查任务管理器(在Windows 至少)查看是否为您分配的内存应用程序增加或基本保持平稳:

    TEST( MyClass, MyClass)
    {
    int some_big_number = 10000;
    for (int i=0; i<some_big_number; i++)
    {
    MyClass *myC = new MyClass;
    delete myC;
    }
    }
  2. 在实例化之前和之后分配一些虚拟变量销毁类实例并检查这两个地址是否是相同。像这样:

    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 应该相同。我只是不确定内存是否分配就是这样工作的。

  3. 使用插件或程序,例如 deleakerValgrind , 但这可能会使我的代码或测试变得不利,我不确定是否无论如何都可以在上面的上下文中使用。

谢谢!

最佳答案

@galop1n 是正确的,无论您是如何一般处理泄漏的。

但是您确实触及了一个有效的点,即 DLL 内存管理。您会看到 DLL 中的对象需要以不同方式处理内存。您将内存管理委托(delegate)给您的库的某个点。在你的库中,内存将按照它们定义的顺序分配。他们将提供释放此内存的方法(例如 CUDA 库 中的 cudaFree)。

您应该在对象的构造函数和析构函数中处理您的内存。 C++ 标准提供了一些很好的机制来为您处理内存。 unique_ptrshared_ptrC++11 中的一个很好的例子,您还可以使用 std 中的容器> 为了同样的目的。

Valgrind也是一个很好的工具,一旦你已经完成了上面提到的所有事情。一旦您使用了 C++ 提供的所有可能的工具,就该使用这个很棒的工具仔细检查您的内存使用情况

关于c++ - 如何检查 C++ 类中的内存泄漏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22614525/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com