c++ 指针或者reference 删除的问题。

zqz981 2009-06-01 06:35:09
自己设计了一个链表

class linker{

public:
linker();
string content

linker* left;
linker* right;
}

我设计了一个程序 用来检测linker的元素,假如符合一定条件
则删除该元素, 并让该元素相应的 left right 连接起来。
伪代码如下所示:

void eleminate(Linker*sn){
...
if(sn符合某种情况){
Linker *left = sn->left;
Linker *right = sn->right;
delete &sn;
left->right = right;
right->left = left;
sn = left;
}
...
}

我发现 在程序里面 left 重新赋值给sn 以后, debug显示sn正常,
但是程序结束后,sn又重新变成野指针。
请指教。
...全文
147 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
HULIHONG 2009-06-01
  • 打赏
  • 举报
回复
delete &sn——只是释放了sn所占的存储空间,但是sn这个指针本身还是存在的,为了避免产生也指针,还应该加上 free(sn)
sun451989 2009-06-01
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 zqz981 的回复:]
引用 6 楼 lingyin55 的回复:
你用new了吗?没有怎么需要delete呢?

则删除该元素, 并让该元素相应的 left right 连接起来。

直接赋值把原来的内容覆盖掉不就行了?



抱歉没有说清楚, 我是用了new 来生成 很多个新的 linker。 并且把他们做成了链表。
所以删除元素的时候 使用 delete。
我发现了我的错误,使用一个linker的返回值就可以了, 因此我猜测如第一楼回复所说, 我程序里面修改的只是局部变量,…
[/Quote]
不知道是不是lz想这样
class Test{
public:
Test(int data){this->data=data;}
int data;
void del(Test* t){
delete t;
}
};
int main (int argc, char *argv[])
{
Test* t1=new Test(4);
t1->del(t1);
return 0;
}
wanglc08 2009-06-01
  • 打赏
  • 举报
回复
delete &sn;
---->
delete sn;
zqz981 2009-06-01
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 lingyin55 的回复:]
你用new了吗?没有怎么需要delete呢?

则删除该元素, 并让该元素相应的 left right 连接起来。

直接赋值把原来的内容覆盖掉不就行了?

[/Quote]

抱歉没有说清楚, 我是用了new 来生成 很多个新的 linker。 并且把他们做成了链表。
所以删除元素的时候 使用 delete。
我发现了我的错误,使用一个linker的返回值就可以了, 因此我猜测如第一楼回复所说, 我程序里面修改的只是局部变量, 因此没有反馈到全局变量里面。
但是我有疑问的是,
如何才能做到 不使用返回值 局部变量修改后, 对应的全局变量也跟着改?
例如本例中 linker* sn 在更改后, 不使用返回值,直接保证 sn的地址发生改变。
lingyin55 2009-06-01
  • 打赏
  • 举报
回复
你用new了吗?没有怎么需要delete呢?

则删除该元素, 并让该元素相应的 left right 连接起来。

直接赋值把原来的内容覆盖掉不就行了?
luojc714 2009-06-01
  • 打赏
  • 举报
回复
个人认为你的函数不应该删除元素,只需要判断一下,删除元素的任务应该放到函数外边进行
sszwbuaa 2009-06-01
  • 打赏
  • 举报
回复
是否应该这样呢?探讨下,我也不太懂~~

sn->left->right = sn->right;
sn->right->left = sn->left;

delete sn->left;
delete sn->right;
  • 打赏
  • 举报
回复
delete &sn;


这是在干吗?没理解
zqz981 2009-06-01
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 HelloDan 的回复:]
delete  &sn;
---->
delete sn;


sn又重新变成野指针。 sn是局部变量。会自己释放的。
[/Quote]
抱歉 那是我写错了,
我刚开始 使用的是 指针,
后来又用地址来测试,
但是自我感觉, 地址 删除后 没法再赋值。 应该是错误的, 遂又改成指针。
HelloDan 2009-06-01
  • 打赏
  • 举报
回复
delete &sn;
---->
delete sn;


sn又重新变成野指针。 sn是局部变量。会自己释放的。

65,210

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧