进入旧版 | 服务项目 | 成功案例 | 联系方式 | 过客留言 | 友情链接
   
设为首页
加入收藏
联系我们
网站首页 | 新闻资讯 | 操作系统 | 办公软件 | 网络软件 | 工具软件 | 媒体动画 | 网页制作 | 网站开发 | 程序开发 | 平面设计
Photoshop视频教程 | Word入门 | Flash入门 | JScript | VBScript | ASP | PHP | ADO | 网页特效 | 3DS MAX6.0命令 | 系统进程
您当前的位置:GOODSGY电脑学习网 -> 程序开发 -> C/C++ -> 文章内容  
浅谈C++/CLI中引用类型的栈对象

在工作中使用C++/CLI,发现其中一些比较有意思的地方,在这就拿C++/CLI中引用类型的栈对象来跟大家一起学习一下,有写得不对的地方望大家多加指点。这也是本人第一篇文章,申请空间已有多半年了,惭愧.......

对于有ISO C++使用背景的技术人员来说,栈对象再也熟悉不过了,它有一个最大特点是确定性资源清理,过了对象的作用返回就会自动释放其所占用的内存。C++/CLI是.NET平台下的C++语言,当然ISO C++的诸多语法保留下来,栈对象便是其一,但是他的语义发生了变化。

大家都知道.NET平台与win32平台最大的差别是托管内存,对C#了解的同志都知道,在C#里面分有值类型(value type)与引用类型(refrence type),值类型对象均分配在栈中,引用类型的都会分配在托管堆中,换句话说就是对象的类型决定了其分配的位置,栈还是托管堆。栈内存的回收还是与以往一样,是确定性的,托管堆内存的回收是由垃圾回收器来负责。然而在这样的内存模型中,MyClass myClass;这个语句在 C++/CLI中的语义会是什么呢?

众所周知,高级语言得以出现,主要归功于编译器,语义会是怎么样当然也取决于编译器的编译结果。下面讲通过一些简单的代码进行讲解,请留意代码中的注释^_^


1using namespace System;
2public ref class MyClass //自定义引用类型
3{
4 public:
5 MyClass() //提供无参构造函数,与ISO C++一样,在声明栈对象时如果不传入参数,便会调用无参构造函数。
6 {}
7
8 ~MyClass() //这便是我们的析构器(Destructor)
9 {
10 m_isDisposed = true;
11 }
12
13 String^ GetString()
14 {
15 if(m_isDisposed)
16 {
17 throw gcnew ObjectDisposedException("MyClass is disposed,can not access disposed memery!");
18 }
19 return "MyClass";
20 }
21
22 static MyClass^ GetInstance()
23 {
24 MyClass result; //声明一个栈对象
25 return %result;
26 /**//*返回栈对象的追踪句柄(tracking handle),对ISO C++比较熟悉的
27 肯定比我都清楚,在使用该函数的返回值会访问非法内存,因为栈对象被销毁,内存已被回收。然而在C++/CLI并
28 不会这样,使用的情况取决于MyClass类型的实现,如果MyClass 实现了Destructor,则编译器会在函数体内给我们加上一些
29 代码,调用myClass对象的Destructor,如果MyClass没有实现Destructor,此时返回值可以正常使用。一下代码为通过Reflector查看的结果,
30 语言为C#
31 public static MyClass GetInstance()
32 {
33 MyClass class2 = null;
34 MyClass class4;
35 MyClass modopt(IsConst) class5 = new MyClass();
36 try
37 {
38 class2 = class5;
39 class4 = class2;
40 }
41 fault
42 {
43 class2.Dispose();
44 }
45 class2.Dispose();
46 return class4;
47 }
48
49 我们将Destrutor注释掉,再次查看编译结果,发现截然不同
50 public static MyClass GetInstance()
51 {
52 return new MyClass();
53 }
54 通过编译结果我们知道没有写Destructor的对象,返回结果可以正常使用。
55 当然在实际工作中我们不会去编写这样的代码,做为学习可以,了解程序运行的各种情况。
56 要是这样写编译器也会给出这样的警告:
57 program1.cpp(91) : warning C4172: returning address of local variable or temporary
58 */
59 }
60
61private:
62 Boolean m_isDisposed;
63
64};
65
66void main()
67{
68 MyClass^ myClass = MyClass::GetInstance() ;
69
70 System::Console::WriteLine(myClass->GetString());
71}

在百度中搜索:浅谈C++/CLI中引用类型的栈对象
在Google中搜索:浅谈C++/CLI中引用类型的栈对象
在Yahoo中搜索:浅谈C++/CLI中引用类型的栈对象

收藏到网摘:新浪VIVI 365key 我摘 POCO网摘 博采中心 YouNote 和讯网摘 天天收藏
[] [返回上一页] [打 印] [收 藏]

 相关文章    最新文章
· 浅谈Vista系统中的几个硬盘杀手
· 浅谈JavaScript中面向对象技术的模拟
· [图文] 《网页设计技巧》系列之一 浅谈文本..
· [组图] 浅谈QQ六大兼职功能
· 言论 浅谈QQ挂机风
· [图文] 浅谈Word中“分离下划线”
· [图文] 浅谈Word中的“分离下划线”
· [组图] 浅谈千兆交换路由器的虚拟路由集群..
· linux学习方向和方法浅谈
· 浅谈Linux优化及安全配置
 
· SOA与数据挖掘在税收系统的应用
· 微软架构师谈编程语言发展之二
· 微软架构师谈编程语言发展之一
· 浅谈C++/CLI中引用类型的栈对象
· [图文] 资源DLL与语言选择菜单的实现
· [图文] 用VSTS代码验证工具捕捉C/C++错误
· C/C++:如何在程序中加载JPG图片?
· 嵌入式系统中文输入法的设计
· 内存调试技巧:C 语言最大难点揭秘
· C程序实现汉字内码与GB码

∷相关文章评论∷    (评论内容只代表网友观点,与本站立场无关!) [更多评论…]
站内搜索

精彩图文
  网站导航  
操作系统 办公软件 网络软件
Vista Windows2003 WindowsXP Windows2000/NT Windows9X/ME Linux 其他 Word Excel Powerpoint Outlook 金山系列 其他 网页浏览 上传下载 联络聊天 邮件工具 服务器软件 网络辅助
工具软件 媒体动画 网页制作
系统工具 媒体工具 压缩工具 图文处理 文件管理 其他 3DMAX Authorware Director Maya 视频处理 其他 Flash Dreamweaver FireWorks FrontPage LiveMotion Golive HTML/CSS 其它
网站开发 平面设计 程序设计
ASP JSP PHP CGI JavaScript VBScript XML/SOAP Web服务器 Photoshop PhotoImpact CorelDraw Illustrator Freehand 设计欣赏 其他 VB VC .NET C/C++ DELPHI JAVA

冀ICP备05019428号
Copyright © 2004-2008 电脑学习网 Inc.All rights reserved.
TEL:13832340607
QQ:39873155
E_Mail:goodsgy(#)hotmail.com   (把(#)替换成@)
MSN:goodsgy(#)hotmail.com   (把(#)替换成@)