由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
Programming版 - 问个c++删除链表(linked list)节点的问题
相关主题
这道题贴过没有?[合集] 关于C++ STL的list的一个问题
C++(非VC++) 删除链表时如何对指针操作? 在线等回复!谢谢!单链表构成的循环链表比单链表有什么优势?
java 链表里面dummy node 一问?谢谢好久没用C++了,想用静态变量写一个简单双向链表,一直报错
问个C++中重复删除指针的问题请教:JavaScript怎么复制一个node(含子节点)? (转载)
问个小问题面题:copy directed graph
问个简单的C++问题删去单向LINKED LIST中的一个节点,假设HEAD is unknown
[合集] 一个链表倒转的问题【C++算法求助】有个O(n*n)的算法不知道该怎么优化并且并行化计算
讨论 找单链表倒数m的节点 (转载)求教:根据给定数组创建二叉树
相关话题的讨论汇总
话题: cur话题: 节点话题: delete话题: null话题: buffer
进入Programming版参与讨论
1 (共1页)
f***c
发帖数: 338
1
在网上看到,基本都是遍历都给定节点,然后将下一个节点指向当前的前一个节点。
大多数的例子,都是对int的链表,所以memory不是问题。如果链表的内容是一个很大
的数据结构,是否需要释放该节点的内存?如何释放?
请专家指点。
谢谢。
这里是我的一个实现。
"delete cur"试图释放节点内存,似乎多此一举,因为这里cur是个auto变量,函数返
回时自动释放内存。
void del(Node *&head, int n) {
Node *cur = head, *pre=NULL;
while (cur) {
if (n == cur->val) {
if (cur == head) {
/* if the node is the head*/
head = head->next;
return;
}
pre->next = cur->next; //next -> pre
delete cur; //free the memory. (?)
return;
}
pre = cur;
cur = cur->next;
}
}
h**********c
发帖数: 4120
2
一般来讲
你要玩pointer就要玩smart pointer,你不知道有没有别的地方refer
不过smart pointer 基本已经没人提了
另外delete 之前应check null, delete 之后,set NULL
总之thread safe是不要想了
f***c
发帖数: 338
3
谢谢指点。

【在 h**********c 的大作中提到】
: 一般来讲
: 你要玩pointer就要玩smart pointer,你不知道有没有别的地方refer
: 不过smart pointer 基本已经没人提了
: 另外delete 之前应check null, delete 之后,set NULL
: 总之thread safe是不要想了

N******K
发帖数: 10202
4
smart pointer 现在是c++标准配置

【在 h**********c 的大作中提到】
: 一般来讲
: 你要玩pointer就要玩smart pointer,你不知道有没有别的地方refer
: 不过smart pointer 基本已经没人提了
: 另外delete 之前应check null, delete 之后,set NULL
: 总之thread safe是不要想了

h**********c
发帖数: 4120
5
long time no c++
does it still use *?

【在 N******K 的大作中提到】
: smart pointer 现在是c++标准配置
p***o
发帖数: 1252
6
有空去看STL的实现,别以为链表简单,需要考虑exception safety的时候
自己琢磨的都不靠谱。

【在 f***c 的大作中提到】
: 在网上看到,基本都是遍历都给定节点,然后将下一个节点指向当前的前一个节点。
: 大多数的例子,都是对int的链表,所以memory不是问题。如果链表的内容是一个很大
: 的数据结构,是否需要释放该节点的内存?如何释放?
: 请专家指点。
: 谢谢。
: 这里是我的一个实现。
: "delete cur"试图释放节点内存,似乎多此一举,因为这里cur是个auto变量,函数返
: 回时自动释放内存。
: void del(Node *&head, int n) {
: Node *cur = head, *pre=NULL;

O*******d
发帖数: 20343
7
cur是一个auto变量不错,但它只是一个指针,函数返回时这个指针就不存在了,但它
指向的内容,如果你不delete,就还是在那里,变成了一个memory leak.

【在 f***c 的大作中提到】
: 在网上看到,基本都是遍历都给定节点,然后将下一个节点指向当前的前一个节点。
: 大多数的例子,都是对int的链表,所以memory不是问题。如果链表的内容是一个很大
: 的数据结构,是否需要释放该节点的内存?如何释放?
: 请专家指点。
: 谢谢。
: 这里是我的一个实现。
: "delete cur"试图释放节点内存,似乎多此一举,因为这里cur是个auto变量,函数返
: 回时自动释放内存。
: void del(Node *&head, int n) {
: Node *cur = head, *pre=NULL;

O*******d
发帖数: 20343
8
delete自己检查是否null。 不需要人工检查。

【在 h**********c 的大作中提到】
: 一般来讲
: 你要玩pointer就要玩smart pointer,你不知道有没有别的地方refer
: 不过smart pointer 基本已经没人提了
: 另外delete 之前应check null, delete 之后,set NULL
: 总之thread safe是不要想了

d****i
发帖数: 4809
9
这个和节点数据是整数型还是复杂类型无关,之所以一定需要delete cur,是因为你创
建这个链表的时候,这个待删除的节点是这样创建的:Node *cur = new Node;所以
delete这行这个相当于是在把这个节点从链表中拿走以后释放这个节点所占用的内存。

【在 f***c 的大作中提到】
: 在网上看到,基本都是遍历都给定节点,然后将下一个节点指向当前的前一个节点。
: 大多数的例子,都是对int的链表,所以memory不是问题。如果链表的内容是一个很大
: 的数据结构,是否需要释放该节点的内存?如何释放?
: 请专家指点。
: 谢谢。
: 这里是我的一个实现。
: "delete cur"试图释放节点内存,似乎多此一举,因为这里cur是个auto变量,函数返
: 回时自动释放内存。
: void del(Node *&head, int n) {
: Node *cur = head, *pre=NULL;

a*********a
发帖数: 3656
10
right. the standard states that "delete 0;" is always safe.

【在 O*******d 的大作中提到】
: delete自己检查是否null。 不需要人工检查。
相关主题
问个简单的C++问题[合集] 关于C++ STL的list的一个问题
[合集] 一个链表倒转的问题单链表构成的循环链表比单链表有什么优势?
讨论 找单链表倒数m的节点 (转载)好久没用C++了,想用静态变量写一个简单双向链表,一直报错
进入Programming版参与讨论
I********t
发帖数: 205
11
这个必须要delete,你每个节点的node都是已经分配好内存了。new出来的东西必须
delete,这个没得商量。
I********t
发帖数: 205
12
还有,你的接口参数既然是指针的引用,不如就用指针的指针,就更省事了,也不需要
什么搞个临时指针指向头部了。
f***c
发帖数: 338
13
虽然在coding练习中,这是一个最基本的习题。但是看得出可考察的东西真多。
受教很多,谢谢各位。
i****k
发帖数: 668
14
STL 还会管你这些事情么,他哪知道你的指针是new出来的还是栈上的,有析构函数调
一下析构函数就完了吧

【在 p***o 的大作中提到】
: 有空去看STL的实现,别以为链表简单,需要考虑exception safety的时候
: 自己琢磨的都不靠谱。

h**********c
发帖数: 4120
15
gcc version 4.4.7 20120313 (Red Hat 4.4.7-11) (GCC)
[root@somectshost ~]# gcc -V
[root@somectshost ~]# gcc hello.cpp -l stdc++ -o hello.exe
[root@somectshost ~]# cat hello.cpp
//refer to malloc example at cplusplus.com
#include
#include
int main() {
char * buffer;
buffer = (char*) malloc(10);
if (buffer == NULL) exit(1);
/*experiment this block, see what happens:
delete buffer;
delete buffer;
*/
if (buffer !=NULL) {
delete buffer;
buffer = NULL;
}
if (buffer !=NULL) {
delete buffer;
buffer = NULL;
}
}
[root@somectshost ~]#
h**********c
发帖数: 4120
16
still have the problem of shallow copy deep copy.

【在 i****k 的大作中提到】
: STL 还会管你这些事情么,他哪知道你的指针是new出来的还是栈上的,有析构函数调
: 一下析构函数就完了吧

x*******9
发帖数: 138
17
1. 还有一种实现方法是将当前要删除节点的值与下一个节点的值交换,再删除下一个
节点。不过与你的需求不符。
2. 内存管理对程序的性能非常重要。如果你的程序对性能非常敏感,建议使用内存池
对程序进行优化。
b*******s
发帖数: 5216
18
只建议写单一对象的内存池,否则往往吃力不讨好

【在 x*******9 的大作中提到】
: 1. 还有一种实现方法是将当前要删除节点的值与下一个节点的值交换,再删除下一个
: 节点。不过与你的需求不符。
: 2. 内存管理对程序的性能非常重要。如果你的程序对性能非常敏感,建议使用内存池
: 对程序进行优化。

d*******s
发帖数: 234
19
这水平还不如国内本科生
1 (共1页)
进入Programming版参与讨论
相关主题
求教:根据给定数组创建二叉树问个小问题
菜鸟读C++ STL源程序的疑问问个简单的C++问题
一个小问题[合集] 一个链表倒转的问题
问一个简单的binary tree 问题讨论 找单链表倒数m的节点 (转载)
这道题贴过没有?[合集] 关于C++ STL的list的一个问题
C++(非VC++) 删除链表时如何对指针操作? 在线等回复!谢谢!单链表构成的循环链表比单链表有什么优势?
java 链表里面dummy node 一问?谢谢好久没用C++了,想用静态变量写一个简单双向链表,一直报错
问个C++中重复删除指针的问题请教:JavaScript怎么复制一个node(含子节点)? (转载)
相关话题的讨论汇总
话题: cur话题: 节点话题: delete话题: null话题: buffer