打印

想不到啊

[复制链接]
1626|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
电脑圆圆|  楼主 | 2009-4-1 15:38 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
林大博士也犯这么低级的错误
以下摘自林锐高质量C++.C编程指南:

(3)指针操作超越了变量的作用范围。这种情况让人防不胜防,示例程序如下:
class A
{
public:
   void Func(void){ cout << “Func of class A” << endl; }
};
void Test(void)
{
   A *p;
   {
     A a;
     p = &a; // 注意 a 的生命期
   }
   p->Func(); // p 是“野指针”
}
函数Test 在执行语句p->Func()时,对象a 已经消失,而p 是指向a 的,所以p 就成了“野指针”。但奇怪的是我运行这个程序时居然没有出错,这可能与编译器有关。

相关帖子

沙发
mohanwei| | 2009-4-1 15:41 | 只看该作者

在VC里,作者的结论是对的

使用特权

评论回复
板凳
芯行天下| | 2009-4-1 15:44 | 只看该作者

这种情况应该很正常,

定义一个空指针,给他赋值,这时编译器并不一定报错。
 uint8 *p;

 *p =9;
 if (*p > 0)
     *p = 0;
编译器并不报错。

使用特权

评论回复
地板
电脑圆圆|  楼主 | 2009-4-1 16:01 | 只看该作者

根本就没什么错

关键是他以为两边加了个中括号就使a变成局部变量,事实上再加n个也没用,那个中括号可有可无

使用特权

评论回复
5
潜艇8421| | 2009-4-1 16:06 | 只看该作者

C++ 一点都不好玩!早就忘光了!

使用特权

评论回复
6
zhenglixin| | 2009-4-1 19:52 | 只看该作者

不是“computer00”哈

使用特权

评论回复
7
老树昏鸦| | 2009-4-1 20:31 | 只看该作者

此帖差点气死老纳也。。。。。。。。

使用特权

评论回复
8
平常人| | 2009-4-1 20:53 | 只看该作者

这次测试不出错,并不表示没有错

实际上你的测试程序占用了不该占用的存储区,只是因为那个区域在那个时刻没有被其它部分占用,是一个真正的"野地址"、"野存储"。

这次侥幸没有出错,但并不表示程序没有错,不要为此冒险。不是林大博士犯这么低级的错误,而是你太自信了,哈哈哈哈。。。。。。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

12

主题

251

帖子

0

粉丝