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

匿名对象生存周期

webgou17年前 (2009-10-27)编程开发275
匿名对象生存周期什么是匿名对象?匿名对象简单的说就是没有名字的对象,和临时对象是完全不相同的。比如交换两个变量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语言
分享给朋友:

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

xmlbean使用

过了几个月突然想到使用xmlbean,一到下午什么都记不起来,翻了老半天,看了下批命令才有点印像。之前打算深入研究一下xmlbean都吾有时间,现在把在公司用到的批命令记下来:1.inst2xsd -design ss -simple-content-types smart  f:\xml…

ASCII码对照表

ascii 0 null ascii 7 beep ascii 8 退格 ...…

3D动画基础

顶点动画...…

Windows CE下操作GPIO的方法(以ARM9 S3C2410为例)

GPIO 是ARM芯片最基本的输入输出通道,在ADS下操作就是一个单片机工作,直接读写其寄存器。在ARM9平台上,Windows CE系统将GPIO的实地址(例如2410的GPIO的基地址为0x56000000)映射到虚拟地址空间(GPIO对应为0xB1600000),这 样,通过对这段虚拟地…

Mac OS X 下修改网卡地址和抵御 ARP 攻击

用 Mac 系统有一段时间了,这里记录一下自己遇到的需要终端命令解决的问题。网络环境绑定了原先机器的 MAC 地址,由于特殊原因,先把新机器的网卡地址改成原先那台。在终端输入sudo ifconfig en0 ether 00:00:00:00:00:00其中 en0 是你的第一块网卡(以太网卡,非…

Android系统架构

android的系统架构和其操作系统一样,采用了分层的架构。从架构图看,android分为四个层,从高层到低层分别是应用程序层、应用程序框架层、系统运行库层和linux核心层。 1.应用程序 Android会同一系列核心应用程序包一起发布,该应用程序包包括email客户端,SMS短消息程序,…

发表评论

访客

看不清,换一张

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