Chinaunix首页 | 论坛 | 博客
  • 博客访问: 527297
  • 博文数量: 1345
  • 博客积分: 3000
  • 博客等级: 中校
  • 技术积分: 14830
  • 用 户 组: 普通用户
  • 注册时间: 2010-06-14 20:32
文章分类

全部博文(1345)

文章存档

2010年(1345)

我的朋友

分类:

2010-10-10 20:24:09

  一、验证栈对象会自动销毁   我们知道,在c++中,在函数中创建了栈对象,函数退出时,该栈对象会自动销毁(栈指针后移了,栈内存会被覆盖)。如何验证这一点?我们需要在函数外定义一个整形变量,在函数内将该函数内获取了变量的地址,在函数调用完毕后,将地址还原成对象: tint iaddr;    /** * 将地址还原成描述符对象并显示出来 * @param aaddr 地址 */ local_c void printstring(tint aaddr)   {   const tbufc<50>& str = *((tbuf<50>*)aaddr);   console->write(str);   }    local_c void dotest()   {   _lit(kstring, "test string");   tbufc<50> str(kstring);   // 获取栈对象str的地址:   iaddr = (tint)&str;   printstring(iaddr);  // 此处可以正常显示出“test string”   }    local_c void mainl()   {   dotest();     printstring(iaddr);  // 此处显示乱码,证明栈对象会自动销毁   }   二、试验:rarray::append方法会保存对象的副本 typedef tbufc<20> tfixedbufc; rarray iarr;    local_c void doinsert()   {   tfixedbufc text1(_l("test1"));   iarr.append(text1);   }    local_c void mainl()   {   doinsert();   tfixedbufc& desc = iarr[0">;   console->write(desc);   }   输出结果:   按照第一点分析,doinsert函数内的栈对象text1会在doinsert函数返回的时候被自动销毁,如果rarray::append方法只是简单的保存了text1的引用的话,程序不可能能够正确的输出test1。所以,我们通过此试验证明append方法中构建了一个text1的副本。   三、证明:rarray::append方法会保存对象的副本 typedef tbufc<20> tfixedbufc; rarray iarr;    local_c void doinsert()   {   tfixedbufc text1(_l("test1"));   tbuf<50> addrstr;      // 获取text1的地址   addrstr.appendnum((tint)&text1);   iarr.append(addrstr);   console->write(addrstr);   console->write(_l("n"));   }    local_c void mainl()   {   doinsert();   tfixedbufc& desc = iarr[0">;   tbuf<50> addrstr;      // 获取desc的地址   addrstr.appendnum((tint)&desc);   console->write(addrstr);   }   我在函数doinsert内获取了描述符text1的地址并显示,并将描述符text1使用rarray::append方法添加到了集合内,在mainl方法内获取了集合第一个元素的引用并将该引用的地址输出。大家可以看到,输出的两个地址并不相同,从而证明了rarray::append方法创建了对象的副本并保存。 如果喜欢symbian编程总结-基础篇-集合与缓冲区请收藏或告诉您的好朋友.
阅读(179) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~