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。 不需要人工检查。
|
|
|
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 | |