我的结构定义如下:
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;
答案 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
结束其生命周期。