- 论坛徽章:
- 0
|
原帖由 ypxing 于 2007-8-9 21:50 发表 ![]()
这个问题是你乱使用
p1 = p2;引起的
跟 p2 = NULL;没有直接的关系
按道理,你也应该把p1 = NULL;也写上
而不是p1和p2都不置NULL
而且问题越早暴露越好
a1析构以后,执行:
*a2->a = 2; //如果析构时已置NULL,那么此时就会报错
....
a2指向的内存由其他方式改变;
....
错误的读取a2;
....
*a2->a = 3; //如果析构时未置NULL,那么此时才能报错
这两种情况你希望哪一个呢?
汗……你没有明白我的意思……我的表达能力太差吗?大家评评理,看看我的回帖是否表意不清。
原帖由 mmmixx 于 2007-8-9 21:16 发表 ![]()
你理解错了我的意思,我明白你想让它出错并显露出来。但是,此时,解引用 a2 已属未定义行为,它可显露,也可以不显露,因为是未定义行为,所以它想怎么样都行。
以目前的实现来讲,当你使用 a2 时,如果原先被释放的内存已被重新利用,并且 a 所在的内存被重新赋值为别的非NULL值,此时,就不会死出来!
例如,a1析构以后,假若有 a3 = new A;,并且刚好分配到 a1 原来指向的空间,而且将 a 的值从 NULL 改成了非 NULL,那么
*(a2->a) = 2;
还是没错! |
|