C ++ - 内存泄漏 - 指向结构的指针

时间:2014-01-31 01:50:12

标签: c++ pointers memory-leaks struct

我的结构定义如下:

typedef struct Edge {
  ...
  struct Edge *next;      // linked list
} Edge;

我在很多功能中使用它。例如,print接收指向结构(root)的指针。在函数中,我需要初始化一个指向root的新指针(并在while循环中使用它来遍历链表)。我不明白内存泄漏在C ++中是如何工作的。

如果我执行以下操作:

Edge *e = root;

然后在while循环中使用e

while (e != NULL) {
   // do stuff
   e = e->next;
}

我是否必须释放指针e?既然它指向一个我想保留的结构,我不删除它?或者也许我应该这样使用它?

void print(Edge* root)
  ...
  Edge *e = new Edge;
  e = root;
  ...

  /* Free e */
  delete e;

3 个答案:

答案 0 :(得分:4)

听起来你对指针是什么以及它与分配/释放内存的关系感到困惑。你可以有任意数量的指针指向一块内存,但内存应该只被释放一次。

在这里,您将Edge*传递给print,以了解从哪里开始打印。您声明的本地Edge*不需要为其分配堆内存,因为e将仅用于指向链表的不同元素,而不是跟踪链表的生命周期。链表。

答案 1 :(得分:1)

在您的情况下,您不需要新的或删除,您使用指向索引链接列表的指针。

Edge *e = root;

这将创建一个指向root指向的节点的指针,e和root指向同一个对象。

while (e != NULL) {
   // do stuff
   e = e->next;
}

迭代链表非常好。

顺便说一下,这对于教育目的来说是好的,在生产代码中我宁愿建议使用STL和std :: list。

答案 2 :(得分:0)

当您不再需要使用new创建的对象时,必须delete结束其生命周期。