Redian新闻
>
问个c++删除链表(linked list)节点的问题
avatar
问个c++删除链表(linked list)节点的问题# Programming - 葵花宝典
f*i
1
父母都退休了,要求手写工作单位和地址还需要吗?可不可以只注明写上“退休”呢?
avatar
l*5
2
没有ssn比较头疼。现在在申请ead中,ead下来之前,没有ssn的情况下,能先开个公司
号嘛?
avatar
f*c
3
在网上看到,基本都是遍历都给定节点,然后将下一个节点指向当前的前一个节点。
大多数的例子,都是对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;
}
}
avatar
t*s
4
写退休前的。
avatar
N*0
5
有ITIN吗?
avatar
h*c
6
一般来讲
你要玩pointer就要玩smart pointer,你不知道有没有别的地方refer
不过smart pointer 基本已经没人提了
另外delete 之前应check null, delete 之后,set NULL
总之thread safe是不要想了
avatar
l*5
7
有的

【在 N******0 的大作中提到】
: 有ITIN吗?
avatar
f*c
8
谢谢指点。

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

avatar
l*5
9
没有ssn比较头疼。现在在申请ead中,ead下来之前,没有ssn的情况下,能先开个公司
号嘛?
avatar
N*K
10
smart pointer 现在是c++标准配置

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

avatar
N*0
11
有ITIN吗?
avatar
h*c
12
long time no c++
does it still use *?

【在 N******K 的大作中提到】
: smart pointer 现在是c++标准配置
avatar
l*5
13
有的

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

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

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

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

avatar
O*d
16
delete自己检查是否null。 不需要人工检查。

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

avatar
d*i
17
这个和节点数据是整数型还是复杂类型无关,之所以一定需要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;

avatar
a*a
18
right. the standard states that "delete 0;" is always safe.

【在 O*******d 的大作中提到】
: delete自己检查是否null。 不需要人工检查。
avatar
I*t
19
这个必须要delete,你每个节点的node都是已经分配好内存了。new出来的东西必须
delete,这个没得商量。
avatar
I*t
20
还有,你的接口参数既然是指针的引用,不如就用指针的指针,就更省事了,也不需要
什么搞个临时指针指向头部了。
avatar
f*c
21
虽然在coding练习中,这是一个最基本的习题。但是看得出可考察的东西真多。
受教很多,谢谢各位。
avatar
i*k
22
STL 还会管你这些事情么,他哪知道你的指针是new出来的还是栈上的,有析构函数调
一下析构函数就完了吧

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

avatar
h*c
23
gcc version 4.4.7 20120313 (Red Hat 4.4.7-11) (GCC)
[[email protected] ~]# gcc -V
[[email protected] ~]# gcc hello.cpp -l stdc++ -o hello.exe
[[email protected] ~]# 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;
}
}
[[email protected] ~]#
avatar
h*c
24
still have the problem of shallow copy deep copy.

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

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

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

avatar
d*s
27
这水平还不如国内本科生
相关阅读
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。