学习C++primer 第20天 之 小问题

jinjunweiruan 2008-07-22 07:02:57
1.书上有这么一句话:“移位操作的右操作数不可以是负数,而且必须是严格小于左操作数位数的人值。否则,操作的效果未定义。”

这里的效果未定义是何意?

2.书上有这么一句话:“对同一个内存空间使用两次delete表达式。如果在其中一个指针上做delete运算,将该对象的内存空间返还给自由存储区,然后接着delete第二个指针,此时则自由存储区可能会被破坏。”

这里大家看看,其中一个指针上做delete运算后,那第二个指针它指向了什么东西?是指向了自由存储区,还是已经没有了?

xx...
...全文
332 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
zgp_lve 2008-07-22
  • 打赏
  • 举报
回复
自己不会试一下有什么效果
zgp_lve 2008-07-22
  • 打赏
  • 举报
回复
你丫问题真多,
zhulinjia 2008-07-22
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 biosli 的回复:]
不用太较真,不用每一句都弄明白,书是要看好多遍的。等用到了发现不明白了再回来看这种边边角角的也可以。

就问题来说:
1.由于编译器实现不同所以做了那种操作结果是不可预测的。也就是告诉你不要这么做。
2.像楼上说的,这是一个代码安全问题,要注意delete的时机,不要delete两次。
[/Quote]
biosli 2008-07-22
  • 打赏
  • 举报
回复
不用太较真,不用每一句都弄明白,书是要看好多遍的。等用到了发现不明白了再回来看这种边边角角的也可以。

就问题来说:
1.由于编译器实现不同所以做了那种操作结果是不可预测的。也就是告诉你不要这么做。
2.像楼上说的,这是一个代码安全问题,要注意delete的时机,不要delete两次。
returnnofalse 2008-07-22
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 Demon__Hunter 的回复:]
2,第二个指针还是指向刚才的存储区,不过这块存储区在第一次delete后,被标记为可用了,可能被别的指针所引用了,再delete后,就会破坏分配在这块存储区的数据~~~
[/Quote]
wjb_yd 2008-07-22
  • 打赏
  • 举报
回复
lz,加油学吧,坚持下去!
wjb_yd 2008-07-22
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 Demon__Hunter 的回复:]
2,第二个指针还是指向刚才的存储区,不过这块存储区在第一次delete后,被标记为可用了,可能被别的指针所引用了,再delete后,就会破坏分配在这块存储区的数据~~~
[/Quote]
matrixdwy 2008-07-22
  • 打赏
  • 举报
回复
delete一个指针之后,该指针依然指向原来的内存空间,为了使你的代码安全,delete之后,将指针赋值为0,
因为delete一个空指针是安全的。
int* p = new int[10];
delete []p;
p = 0;
delete []p; //OK, it's safe

mingguang7213 2008-07-22
  • 打赏
  • 举报
回复
1.出现不可预料结果
2.你这说的多个指针指向同一个内存的情况,当其中任意个指针delete后,其余指针还是指向这块地址的,但这块地址已经释放掉,在程序运行过程中也可能被重新分配,所以delete其余的指针式,会产生错误,出现内存泄露
sunhuanwen 2008-07-22
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 fetag 的回复:]
1.书上有这么一句话:“移位操作的右操作数不可以是负数,而且必须是严格小于左操作数位数的人值。否则,操作的效果未定义。”

这里的效果未定义是何意?
/*
移位操作分为左移和右移,各有什么效果你肯定明白吧。你想想,如果移负数位,结果会怎么样呢?你看到过移1/2这样的情况吗?效果未定义就是说,出现什么结果谁也不确定,完全取决于编译器怎么实现,如果编译器系统,崩溃了系统也是真长的!
*/

2.书上有这…
[/Quote]

引用一下

支持正版!
给我这种盗版一点活路吧。。。
zghua851004 2008-07-22
  • 打赏
  • 举报
回复
学习
pengzhixi 2008-07-22
  • 打赏
  • 举报
回复
移位操作的右操作数是负数的话,你怎么去理解这到底该怎么移呢?真象过儿说的那样如果是-2的话是不是理解成1的-2次方呢?明显做不到嘛。
chlaws 2008-07-22
  • 打赏
  • 举报
回复
不会这么难理解吧
看LZ也够勤奋的一天没问题也整两个出来给过儿散散分
机智的呆呆 2008-07-22
  • 打赏
  • 举报
回复
2,第二个指针还是指向刚才的存储区,不过这块存储区在第一次delete后,被标记为可用了,可能被别的指针所引用了,再delete后,就会破坏分配在这块存储区的数据~~~
yumei20001 2008-07-22
  • 打赏
  • 举报
回复
C++ primer 容易掉进纯理论的陷阱,还是做点实际的项目
独孤过儿 2008-07-22
  • 打赏
  • 举报
回复
1.书上有这么一句话:“移位操作的右操作数不可以是负数,而且必须是严格小于左操作数位数的人值。否则,操作的效果未定义。”

这里的效果未定义是何意?
/*
移位操作分为左移和右移,各有什么效果你肯定明白吧。你想想,如果移负数位,结果会怎么样呢?你看到过移1/2这样的情况吗?效果未定义就是说,出现什么结果谁也不确定,完全取决于编译器怎么实现,如果编译器系统,崩溃了系统也是真长的!
*/

2.书上有这么一句话:“对同一个内存空间使用两次delete表达式。如果在其中一个指针上做delete运算,将该对象的内存空间返还给自由存储区,然后接着delete第二个指针,此时则自由存储区可能会被破坏。”

这里大家看看,其中一个指针上做delete运算后,那第二个指针它指向了什么东西?是指向了自由存储区,还是已经没有了?

/*
别深究这种“旁门左道”,浪费时间,浪费生命,只要记住,一个new出来的空间,只要delete一次就行了。在实际工作中,delete两次的情况几乎没有,而只new没有delete的情况却要多得多,所以内存泄露才会那么屡见不鲜...
*/
antimatterworld 2008-07-22
  • 打赏
  • 举报
回复
[Quote=引用楼主 jinjunweiruan 的帖子:]
1.书上有这么一句话:“移位操作的右操作数不可以是负数,而且必须是严格小于左操作数位数的人值。否则,操作的效果未定义。”
这里的效果未定义是何意?
[/Quote]
不懂,学习。
想学学汇编,直接看汇编输出码就啥都明白了。
antimatterworld 2008-07-22
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 Demon__Hunter 的回复:]
2,第二个指针还是指向刚才的存储区,不过这块存储区在第一次delete后,被标记为可用了,可能被别的指针所引用了,再delete后,就会破坏分配在这块存储区的数据~~~
[/Quote]
学习了,我原来也迷糊,现在知道了,哈哈
skineffect 2008-07-22
  • 打赏
  • 举报
回复
同上:-)
yph007595 2008-07-22
  • 打赏
  • 举报
回复
太好学了吧 你
加载更多回复(2)

64,663

社区成员

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

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