【问题标题】:Linked list with memory leak issues存在内存泄漏问题的链表
【发布时间】:2019-09-13 06:34:00
【问题描述】:

这个程序充当了一个模板,它将成为具有唯一名称和颜色的兔子对象的链接列表。

int Nodes::insert()
{

  Node* new_node = (Node*) malloc(sizeof(Node));

  new_node->name = getName();

  new_node->prev = NULL;
  new_node->next = head;

  if (head != NULL)
  {
    head->prev = new_node;
  }

  head = new_node;

  return 0;
}

当节点(兔子)插入到链表中时,从返回的函数调用中分配唯一属性。

new_node->name = getName();

函数调用工作正常,直到我调用它来创建多个节点导致此错误:

> *** Error in `./zBunny.exe': free(): invalid pointer: 0x00007f0e528dab78 ***
======= Backtrace: =========
/lib/x86_64-linux-gnu/libc.so.6(+0x777e5)[0x7f0e5258d7e5]
/lib/x86_64-linux-gnu/libc.so.6(+0x8037a)[0x7f0e5259637a]
/lib/x86_64-linux-gnu/libc.so.6(cfree+0x4c)[0x7f0e5259a53c]
./zBunny.exe[0x4016e8]
./zBunny.exe[0x401ef2]
/lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xf0)[0x7f0e52536830]
./zBunny.exe[0x401569]
======= Memory map: ========
00400000-00404000 r-xp 00000000 08:10 33423400                           /media/keifer/Storage/cppProjects/examples/bunny/zBunny.exe
00604000-00605000 r--p 00004000 08:10 33423400                           /media/keifer/Storage/cppProjects/examples/bunny/zBunny.exe
00605000-00606000 rw-p 00005000 08:10 33423400                           /media/keifer/Storage/cppProjects/examples/bunny/zBunny.exe
01f52000-01f84000 rw-p 00000000 00:00 0                                  [heap]
7f0e4c000000-7f0e4c021000 rw-p 00000000 00:00 0 
7f0e4c021000-7f0e50000000 ---p 00000000 00:00 0 
7f0e5220d000-7f0e52315000 r-xp 00000000 fc:01 5509816                    /lib/x86_64-linux-gnu/libm-2.23.so
7f0e52315000-7f0e52514000 ---p 00108000 fc:01 5509816                    /lib/x86_64-linux-gnu/libm-2.23.so
7f0e52514000-7f0e52515000 r--p 00107000 fc:01 5509816                    /lib/x86_64-linux-gnu/libm-2.23.so
7f0e52515000-7f0e52516000 rw-p 00108000 fc:01 5509816                    /lib/x86_64-linux-gnu/libm-2.23.so
7f0e52516000-7f0e526d6000 r-xp 00000000 fc:01 5509806                    /lib/x86_64-linux-gnu/libc-2.23.so
7f0e526d6000-7f0e528d6000 ---p 001c0000 fc:01 5509806                    /lib/x86_64-linux-gnu/libc-2.23.so
7f0e528d6000-7f0e528da000 r--p 001c0000 fc:01 5509806                    /lib/x86_64-linux-gnu/libc-2.23.so
7f0e528da000-7f0e528dc000 rw-p 001c4000 fc:01 5509806                    /lib/x86_64-linux-gnu/libc-2.23.so
7f0e528dc000-7f0e528e0000 rw-p 00000000 00:00 0 
7f0e528e0000-7f0e528f6000 r-xp 00000000 fc:01 5509743                    /lib/x86_64-linux-gnu/libgcc_s.so.1
7f0e528f6000-7f0e52af5000 ---p 00016000 fc:01 5509743                    /lib/x86_64-linux-gnu/libgcc_s.so.1
7f0e52af5000-7f0e52af6000 rw-p 00015000 fc:01 5509743                    /lib/x86_64-linux-gnu/libgcc_s.so.1
7f0e52af6000-7f0e52c68000 r-xp 00000000 fc:01 3670249                    /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.21
7f0e52c68000-7f0e52e68000 ---p 00172000 fc:01 3670249                    /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.21
7f0e52e68000-7f0e52e72000 r--p 00172000 fc:01 3670249                    /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.21
7f0e52e72000-7f0e52e74000 rw-p 0017c000 fc:01 3670249                    /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.21
7f0e52e74000-7f0e52e78000 rw-p 00000000 00:00 0 
7f0e52e78000-7f0e52e9e000 r-xp 00000000 fc:01 5509685                    /lib/x86_64-linux-gnu/ld-2.23.so
7f0e53073000-7f0e53079000 rw-p 00000000 00:00 0 
7f0e5309c000-7f0e5309d000 rw-p 00000000 00:00 0 
7f0e5309d000-7f0e5309e000 r--p 00025000 fc:01 5509685                    /lib/x86_64-linux-gnu/ld-2.23.so
7f0e5309e000-7f0e5309f000 rw-p 00026000 fc:01 5509685                    /lib/x86_64-linux-gnu/ld-2.23.so
7f0e5309f000-7f0e530a0000 rw-p 00000000 00:00 0 
7ffe1d800000-7ffe1d821000 rw-p 00000000 00:00 0                          [stack]
7ffe1d9b0000-7ffe1d9b2000 r--p 00000000 00:00 0                          [vvar]
7ffe1d9b2000-7ffe1d9b4000 r-xp 00000000 00:00 0                          [vdso]
ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0                  [vsyscall]
Aborted

完整代码:

#include<iostream>
#include<fstream>
#include<vector>
#include<string>

using std::vector;
using std::string;
using std::cout;
using std::endl;


class Node
{
    public:
        int data;
        string name;

        Node* next;
        Node* prev;
};

class Nodes{
    private:
        Node* head = NULL;

    public:
        int insert(); 
        void display();
        int randomGen(int n);
        string getName();
        void extract(std::vector<string> *vect, string fileName);

};

int Nodes::insert()
{
    Node* new_node = (Node*) malloc(sizeof(Node));

    new_node->name = getName();

    new_node->prev = NULL;
    new_node->next = head;

    if (head != NULL)
    {
        head->prev = new_node;
    }

    head = new_node;

    return 0;
}


int main()
{
    Nodes control;
    control.insert();
    control.insert();
    // control.insert();
    // control.insert();
}

【问题讨论】:

  • 请发minimal reproducible example - 强调最小化。当您发布这么多时,很多人甚至都不会费心阅读它。让人们轻松帮助您,您更有可能获得帮助。只是要重现的最少代码和错误消息。我们不需要任何评论。例如“我的思考过程......”
  • 我的编辑好点了吗?
  • 是的,这样更好:)。你的答案在下面
  • 太棒了!谢谢你的建议。

标签: c++ oop linked-list


【解决方案1】:

不要在 C++ 中使用 malloc / free。改用 new / delete / delete []。

【讨论】:

  • 虽然这是真的,但它更像是一个评论而不是一个答案。
【解决方案2】:

您正在使用“malloc”在其中创建Nodestd::string,但这不起作用。您需要改用new。除此之外的任何事情都是未定义的行为。 new 调用构造函数,这是设置对象正常工作所必需的。

除此之外,您没有使用delete 在析构函数中清理您的Node 分配,因此在程序结束时它们被“泄露”——尽管操作系统无论如何都会回收内存。

【讨论】:

  • 我尝试了新的并且成功了!当你说我用 malloc 创建一个字符串时,我对到底发生了什么感到困惑。
  • Node 对象的大小考虑了字符串对象的大小(但不一定是字符串内容),所以当你 malloc 节点时,你也在 malloc'ing 空间对于字符串...但是由于没有运行构造函数(因为您没有使用new),它不是一个有效的字符串 - 它永远没有机会正确设置自己以准备好使用。当你做错了,就无法保证程序的其余部分将如何运行——这就是所谓的 UB(未定义行为)
  • 我实际上刚刚找到了另一个post,它巩固了你刚才所说的话。我现在明白了谢谢您的反馈。
猜你喜欢
  • 2019-12-18
  • 1970-01-01
  • 2017-09-26
  • 1970-01-01
  • 2016-07-28
相关资源
最近更新 更多