gpt4 book ai didi

c++ - 如何确认您没有内存泄漏?

转载 作者:塔克拉玛干 更新时间:2023-11-03 08:24:57 25 4
gpt4 key购买 nike

所以..我正在尝试编写我的第一个析构函数。我有某事,但我不知道它是否真的在做它应该做的事情。

我有一个线性链表,其中每个节点都有 3 个动态分配的 char 数组和一个下一个指针(heads)指向另一个也有 1 个动态 char 数组的链表。换句话说,数据结构是链表的链表。这是我写的:

nodea * tempa = heada;//create a new node to
nodesongs *temps=heada->heads;

while(heada)// while the list is not empty
{

tempa= heada ->nexta;// traverse the list
delete [] heada->dataa.name ;
delete [] heada->dataa.story ;
delete [] heada->dataa.description ;

while(heada->heads)
{
temps = heada ->heads->nexts;
delete[] heada->heads->datas.title;
delete heada->heads;
heada->heads = temps;
}
delete heada;
heada = tempa;

}

如果您能看一下,我将不胜感激,并且我想知道人们是否有一种通用的方法来测试他们的代码是否存在内存泄漏?

最佳答案

How to confirm you are not having memory leaks?

C++ 程序没有标准的方法来检查自己的状态并发现内存泄漏。

然而,有一些编程工具可以检测特定执行是否已泄漏内存。这些可以告诉您泄漏了什么,但这并不一定能帮助您理解泄漏的原因

您可以做的是分析您编写的程序,并从逻辑上推断是否会泄漏任何手动分配的内存。这通常很难做到(这就是编译器无法为您完成的原因),但如果您遵循最佳实践,它会变得易于管理:

  • 永远不要手动管理内存(99.99% 的可能性你不需要)
    1. 永远不要调用new,也不要调用malloc
    2. 总是在接收到拥有的指针后立即将它们包裹在智能指针中
    3. 经常阅读您使用的库的文档。如果一个函数给你一个裸指针,仔细检查你是否负责处理它;如果是,请参阅 2。
      • 这在处理具有 C API 的库时很典型。有时还会使用旧的或设计不当的 C++ API。
  • 如果你手动管理内存(但不要,因为你不需要)
    • 只在 RAII 中这样做时尚
      1. 所属指针应该是类的私有(private)成员。这种封装将您必须分析的范围从整个程序缩小到此类的成员函数。
        • 永远不要返回对该成员的引用或指针,只返回拷贝(甚至可能不返回)。返回引用会破坏封装(仅非 const 引用,但通过 const 引用返回指针没有任何意义)。
      2. 类不变性:指针必须始终指向 null 或有效的动态分配对象;该类的任何其他实例都不能指向该对象。
        • 如果允许成员不指向有效的动态分配对象(或 null),则处于这种状态的对象的析构函数将具有未定义的行为。
        • 如果允许多个对象拥有同一个指针,那么销毁一个对象会导致另一个对象违反关于指向有效对象的不变量。
        • 隐式复制/移动构造函数和赋值运算符执行浅拷贝,这会导致违反这些不变量。因此我们必须遵循rule of 3 (or 5)
      3. 类的析构函数必须删除指针
      4. 任何一次分配该成员时,要么删除旧值,要么将其所有权“转移”到另一个对象(除非指针具有未指定的值,由于 5.,它只能在构造函数中)。这些分配是您最有可能意外泄漏内存的地方。
      5. 每个类最多只有 1 个拥有的裸指针。必要时使用嵌套类。这个建议是为了让保证成为可能/更容易exception safety .缺乏异常安全性是更隐蔽的内存泄漏方式。

关于您的代码,让我们假设您必须手动管理内存以了解如何操作,因此我的建议 1 和 2 不是一个选项:

delete [] heada->dataa.name ;
delete [] heada->dataa.story ;

错误 1:不要删除其他对象拥有的指针。这违反了我的建议 6。改为在该对象的析构函数中删除。

错误 2:在容器对象 (*heada) 的生命周期中,不要让指针指向已删除的对象 这是错误 1 ​​的结果。并且违反了我的建议5.

错误 3:不要在单个对象中有多个裸拥有指针。这违反了我的建议 8。

关于c++ - 如何确认您没有内存泄漏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46728620/

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