回首页 回首页 ◎ 设为首页  
◎ 收藏本站  
◎ 给我留言  
  
  首 页  C/C++教程  C++之父的FAQ  C/C++动向  C/C++源代码  C/C++误区  Unix/Linux  下载中心  乱七八糟  蚂蚁的Blog  
  当前位置:首 页 >> C++之父的FAQ >> C++ 风格与技术 FAQ >> [转] 为何delete操作不把指针置零?
最 近 更 新
[转] 我该把const写在类..
[翻译] 我应该使用按值..
[翻译] 你如何命名变量..
[转] 何种代码布局风格..
[转] “int* p;”和“in..
[翻译] “cout”怎么念?
[转] 宏有什么不好吗?推荐
[翻译] static_cast 有..推荐
[翻译]为何C++里有些东..推荐
[翻译] i++ + i++ 的值..推荐
最 新 推 荐
[转] 宏有什么不好吗?推荐
[翻译] static_cast 有..推荐
[翻译]为何C++里有些东..推荐
[翻译] i++ + i++ 的值..推荐
[翻译] 数组有何不好之..推荐
[转] 为何delete操作不..推荐
[转] 有placement delet..推荐
[翻译] “new”和“mall..推荐
[转] C和C++风格的内存..推荐
[翻译] 为何标准容器效..推荐
热 门 排 行
[转] 我可以写“void ma..
[翻译] 什么是纯虚函数?
[转] 我该把const写在类..
[翻译] i++ + i++ 的值..推荐
[转] 这个简单的程序…..推荐
[转] 我如何从标准输入..
[转] 我怎样才能把整数..
[翻译] static_cast 有..推荐
[转] 宏有什么不好吗?推荐
[转] 我应该怎样处理内..推荐
站 内 搜 索

Web stdcpp.cn
关键词

搜索方式

搜索范围

精确匹配
广 告

[转] 为何delete操作不把指针置零?


来源:C++ Style and Technique 作者:Bjarne Stroustrup 翻译:紫云英 等级:精品
发布于2007-07-28 19:24 被读750次 【字体:

Q: 为何delete操作不把指针置零?

A: 嗯,问得挺有道理的。我们来看:
	delete p;
	// ...
	delete p;
 
如果代码中的//...部分没有再次给p分配内存,那么这段代码就对同一片内存释放了两次。这是个严重的错误,可惜C++无法有效地阻止你写这种代码。不过,我们都知道,释放空指针是无危害的,所以如果在每一个delete p;后面都紧接一个p = 0;,那么两次释放同一片内存的错误就不会发生了。尽管如此,在C++中没有任何语法可以强制程序员在释放指针后立刻将该指针归零。所以,看来避免犯这样的错误的重任只能全落在程序员肩上了。或许,delete自动把指针归零真是个好主意?

哦,不不,这个主意不够“好”。一个理由是,被delete的指针未必是左值。我们来看:

	delete p+1;
	delete f(x);
 
你让delete把什么自动置零?也许这样的例子不常见,但足可证明“delete自动把指针归零”并不保险。[译注:事实上,我们真正想要的是:“任何指向被释放的内存区域的指针都被自动归零”——但可惜除了Garbage Collector外没什么东东可以做到这点。] 再来看个简单例子:
	T* p = new T;
	T* q = p;
	delete p;
	delete q;	// ouch!
 
C++标准其实允许编译器实作为“自动把传给delete的左值置零”,我也希望编译器厂商这样做,但看来厂商们并不喜欢这样。一个理由就是上述例子——第3行语句如果delete把p自动置零了又如何呢?q又没有被自动置零,第4行照样出错。

如果你觉得释放内存时把指针置零很重要,那么不妨写这样一个destroy函数:

	template<class T> inline void destroy(T*& p) { delete p; p = 0; }

不妨把delete带来的麻烦看作“尽量少用new/delete,多用标准库中的容器”之另一条理由吧 :O)

请注意,把指针作为引用传递(以便delete可以把指针置零)会带来额外的效益——防止右值被传递给destroy() :

	int* f();
	int* p;
	// ...
	destroy(f());	// error: trying to pass an rvalue by non-const reference
	destroy(p+1);	// error: trying to pass an rvalue by non-const reference
原文地址:http://www.research.att.com/~bs/bs_faq2.html#delete-zero

本文乃网上搜集得来,其版权归原作者和原出处所有。如有侵犯版权之处请与我联系,我将马上进行处理。



相关专题:C++ 之父的言论
[转] 我该把const写在类型前面还是后面?
[翻译] 我应该使用按值传递还是按引用传递?

上一篇:[转] 有placement delete吗?
下一篇:[翻译] 数组有何不好之处?

共有评论 0 条 网友评分 1分 查看全部评论

查看全部评论

【发表评论】 评分:1分 2分 3分 4分 5分


验证码:

Powered By Www.Xydw.COM Ver1.14 管理
Copyright © 2005-2006 蚂蚁的 C/C++ 标准编程 All Right Reserved. XCMS
粤ICP备06014124号   站长:Antigloss