当前位置:首页 > 编程开发

匿名对象生存周期

webgou17年前 (2009-10-27)编程开发226
匿名对象生存周期什么是匿名对象?匿名对象简单的说就是没有名字的对象,和临时对象是完全不相同的。比如交换两个变量a、b的值通常做法是使用一个临时变量c int a=1,b=2,c; c=a; a=b; b=c; 这样的一个过程这里的c在这个过程之后就不在需要,但交换过程中就须要这样一个对象存在,那么这个c就是一个临时对象。而匿名对象则根本没有名字,这点在C++中很常见。比如你要连接一个两个字符串然后输出。 int main() { string a("aaa"),b("bbb"); printf("%s",(a+b).c_str() ); return 0; } 这个时候输出的就是aaabbb这样的一个字符串,当然原来的变量a,b都没有任何变化。这是因为string类重载了+号函数大致如下(当然STL中的不是这个样子,我这样是为了简便,但功能是相同的) string operator+(string& opt1,string& opt2); 该函数返回一个string对象,而例子程序中并没有出现这个对象,但这个对象却却实实存在着。编译器大致会将程序代码处理成这个样子。其中_1234897erw_是我随便打的名字实际上编译器可能随机生成一个名字,这个对象的有效范围就是{}之中的范围。简单的说就是匿名对象存在的当前行是有效的,一旦到了下一行,这个对象就已经无效。 int main() { string a::a("aaa"); string b::b("bbb"); { string _1234897erw_ = a+b;构造对象 printf("%s",_1234897erw_.c_str() ); _1234897erw_::~_1234897erw_();析构对象 } b::~b(); a::~a(); return 0; } 关于临时变量很常见的错误就是 int main() { string a("aaa"),b("bbb"); const char* p = (a+b).c_str(); printf("%s", p); return 0; } 虽然这样在很多编译器上可以正常输出结果,但这样的做法是错误的。按照匿名变量的生存范围来说p所指向的内容只在当前行有效,一旦到了printf的这一行,p所指向的内容已经无效。所以输出的内容也是不正确的,虽然有时候可以正常输出。 为什么会正常输出,这依赖于库的实现。在匿名string析构的时候,会将所分配的内存空间释放,然而这个释放并不是将原来的内容清除,仅仅是将这块内存空间标志为可用,里面的内容可能不清除(效率因素)。这块内存的内容不清除的话,还是能够得到其内容的(取内容之需要一个*操作符),但这块内存不是你所拥有的,这个时候正确也只是运气。 转载出处:http://blog.csdn.net/akirya/archive/2007/03/13/1527541.aspx

扫描二维码推送至手机访问。

版权声明:本文由知了博客发布,如需转载请注明出处。

本文链接:https://www.webgou.info/?id=73

标签: c语言
分享给朋友:

“匿名对象生存周期” 的相关文章

主流 AI 代码助手功能分析(2026年3月)

 一、市场概览AI 代码助手已从"补全工具"进化为"编程代理",核心趋势:从补全到 Agent:能自主完成完整功能、跑测试、提交 PRIDE 深度整合:Cursor、Windsurf 直接 fork VSCode多模型路由:GPT-4o、Claude…

cooliris应用

下面为cooliris用falsh嵌入Flickr图片,效果很好. 本来想找到cooliris源码,再继续分析,cooliris的实现过程,我猜想cooliris是基于GPL的认证,由于其实现采用B-S,所以要想获得其在服务器上的代码有点困难,尽管有人可以用反编译出其Actoinscript源码,反…

打印出:2,3,5,9,17,33,65

打印出:2,3,5,9,17,33,65…

局域网络存储的用户名和密码清除

局域网络存储的用户名和密码清除 单击“开始-˃运行”,在输入框中键入control keymgr.dll 会出来“存储的用户名和密码”,这样可以清除调记忆的用户信息。…

35个强大的UI设计教程

下面是35个非常不错的UI设计的的教程及效果图,非常不错哦。不但教你如何做一些特效,同样教你如何做UI布局和界面设计。当然,他们风格迥异,也基本上都是Web页面上的。都非常不错。希望你喜欢。(点击下面的图片可以打开相关的教程) Old Paper Layout   Professiona…

vc串口编程

1.打开串口:在Window 95下串行口作为文件处理,使用文件操作对串行口进行处理。使用CreateFile()打开串口,CreateFile()将返回串口的句柄。HANDLE CreateFile(LPCTSTR lpFileName, // pointer to name of the fil…

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。