分享
 
 
 

对话:#02 空引用

王朝vc·作者佚名  2006-01-08
窄屏简体版  字體: |||超大  

[声明]:本英文资料源自于Herb Sutter 创建的“Conversation”栏目,“C++ 翻译小组”的翻译作品供学习交流与参考用途,不得用于任何商业用途。未经Herb Sutter、Jim Hyslop同意,不得转载;对于违反以上条款,翻译小组对此不负任何责任;特此声明。

文章来源:http://www.gotw.ca

版权归属:Herb Sutter and Jim Hyslop

译 者:夏天

对话:#02 空引用

在船上,你最后想感受的就是海风了。我和珍妮碰巧很不凑巧,最接近事故发生地点。我们费尽力气,将笨重的房门关上,并将其密封,使打破的小房间与外面隔绝。当我们靠在门上,作深呼吸的时候,汽笛突然停止鸣响.

“他奶奶的,到底怎么回事?”值班驾驶员刺耳的声音穿过了整个船舱。

“小小渗漏而已,先生,”珍妮回答,“我们已封好了那间船厢,问题已解决,没事了。”

“你密封了船厢?为什么它不能自动密封呢?刚才我们不是把门重修了吗?”

珍妮和我对望了一眼。“哦,先生,维修人员都认为这个新的锁闭装置不会有问题,因为它是刚从工厂出来的,是崭新的,因此他们没有检查它。它是好的,只不过他们没有取下所有的包装材料,所以它不能自动密封。”

稍停片刻后,珍妮接着说,“对,干得不错。有个维修人员正在赶来。” 接着,恰好在被打破的船舱前面,我们听到XO的声音在说:“约翰逊先生,叫工程部主管到我的船舱来见我。告诉雷利到...”

我对着珍妮咧嘴一笑,“能听到刚才的对话,我愿意付一个星期的薪水。它提醒了我我们以前遇到的一个编码安全的问题,这是很久以前的事了...”

- - - - - - - - - - - - - - - - - - - - - - - - -

我的第一份编程工作已干了几个星期了,也熟悉了同一项目组的其他的程序员,其中一个是鲍勃。几乎在每一个方面,他都与Guru形成鲜明对比。鲍勃是个自命不凡的家伙,他的代码让其他人很难维护,并且经常违反编程的规则。

我已经一头扎进我的第一个项目,鲍勃的任务是对我经手的一些资料进行核查。他来到我的桌边,拿着一杯咖啡,靠在隔板上,“你的代码由于在你的helper函数里存在一个存取违规而崩溃。”他说,“在Space Cadet知道之前,你最好把它改好。”

“Guru的确是一个优秀的程序员,鲍勃,”我生气了。的确,Guru是很古怪,在她旁边时,我也不自在。每次我和她谈话时,我总是不断考虑更新我的概略,但是鲍勃刚才的态度莫名其妙地激怒了我。

“是,不管怎样,”鲍勃轻蔑地晃了晃杯子,溅出一点咖啡,“总之,你的helper函数使用了空的指针。让我们来看一看。”

“但helper函数并没有使用任何指针啊,”我皱了皱眉头。“只不过是一个对xWrapper类的引用而已。”我在文本编辑器里找出代码。它看起来是这样的:

class xWrapper

{

/* ... */

public:

virtual void dump() { cout << name << endl; }

};

void helper( xWrapper& w )

{

w.dump();

// ... do other stuff with w ...

}

鲍勃将头伸向显示器,“是的,就是在dump()语句这里崩溃。”他抓了抓鼻子说。

“那是不可能的。”

“确实是这样,年轻人。” 鲍勃真的让我心烦意乱,“我所做的就是从类工厂中取得一个新指针,把它传递给你,而你就对它进行提领操作。如果那个指针是个空指针,你就引用了一个空指针。你再仔细看看。”

“嗯,是吗,”我支吾道,信心有点动摇。毕竟,我刚从学校出来,而鲍勃已经有几年的经验了。“我想要注意到引用是否为空是不可能的。”

“你所要做的,”鲍勃说,“就是检查引用的地址。象我说的,如果想要安全,你就应该检查它...”

“不,”Guru平静的声音把我们两人都吓一跳。她又一次出现在恰当的时候。现在,她正站在我们身后,手里拿着一本打开的大书。“没必要这么麻烦。标准告诉我们不存在空引用。”

“但它这是可能的,”鲍勃坚持道,“我们刚刚展示显示了这一点,是他的问题。”

我真想打他几耳光。Guru只是冷眼看了他一下。“不,你应该检查那个。绝不要提领一个空指针。改一下你的代码:如果指针是空的,就不要调用helper()。今天下午把能够运行的代码给我看看。让这种难看的程序方法滚蛋。”她挥挥手让他离开。

鲍勃眨了眨眼。但她是这组里的高级程序员,因此他什么也没说就走开了。

“我的学徒工,”她继续单独地跟我说,“使用引用代替指针的主要的理由之一就是把你从不得不测试它是否引用一个无效的目标的负担中解放出来。空引用的唯一来源就是提领一个空指针——这在神圣的标准里明确被禁止,在未定义的行为(Undefined Behavior)里也写的很清楚。”

“OK,但是为什么只告诉我?为什么不告诉鲍勃呢?”

她悲伤地摇摇头。“他知道这个。我说服不了他 ,他已经沉湎于未定义的行为了。我的学徒工,小心踏入未定义行为这条路。一旦你走上这条路,你就会受它控制,当你试图捕捉并且解决问题时,它将耗费你的时间。”

我心中暗自掂量。“好,”我问道,“创建一个无效的引用会有什么样的危险?比方说,你传递了一个对象给一个函数,但你传的那个对象在函数结束前超出了它的范围。你怎样预防这种情况的出现呢?”

她摇了摇头:“这个办不到。从这方面来说,引用和指针是很类似的。想想这个比喻。”Guru很快地在我的白色书写板写下了一些代码:

T* f()

{

T t;

return &t; //返回一个悬而未决的指针

}

void f1( T* t )

{

if( t )

t->doSomething();

}

int main()

{

T *tPtr = f();

f1( tPtr ); // 非法

}

“这个f()函数显然为人所诟病。”她理了理耳后一络银灰的头发,接着说,“它返回一个指向局部对象的指针,当函数结束时,该变量就超出了其作用范围。因此tPtr在main()里指向一个已被删除的对象。f1()函数尽了最大努力——它对空指针进行了检查。一些平台也提供编译器专用函数来检测一个指针是否指向一块有效的内存区域。但是,这些函数还是无法检测到上面例子中的那种情况。在f1()内部,变量t没有指向一个有效的T类型的对象,因此f1()函数无法确定t是否有效。 因此当程序员写f1()时,要相信你的程序员同事们会尽他们最大努力,确保向你提供的指针是指向一个有效的对象的。

“就像你必须假定一个非空的指针是有效的一样,你必须假定一个引用也是有效的。在你的程序员同事中你必须要有信心。”

“即使是鲍勃?”我问道。

她用一种悲伤的表情点点头,然后看着她那本大部头书沿着走廊飘然而去。

- - - - - - - - - - - - - - - - - - - - - - - - -

“鲍勃还是坚持已见吗?”珍妮问道

“比他应该坚持的时间要长。”我停止微笑,“我们公司也做一些软件,是用于起搏器的。你知道,这种设备是要植入到胸腔里的。有一次,他测试一段代码,还没等这些代码验证所有的先决条件,就整合到产品中了。并且...”

珍妮耸了耸眉毛。

我悲哀地点点头:“鲍勃最后又找到了别一份工作,是做零售的。他应该高兴才是,国为这是在程序员责任法颁布之前的事。”这时,事故控制小组接过我们的工作,我们作好准备,继续进行监视。

这不是我最后一次和珍妮讨论有关Guru,或更多令人愉快的事。

[关于作者]

Herb Sutter

是个独立顾问,也是ISO/ANSI C++标准委员会的秘书。你可通过hsutter@acm.org.联系他

Jim Hyslop

Leitch Technology International Inc.资深的软件设计师,你可通过jim.hyslop@leitch.com联系他

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有