会员注册 | 电脑急诊 | 中国汽车救援中心网 | 中国电脑视频网 | 装机必备软件 | 淘宝商城
·维修资料下载
·视频教程下载
·
网络教程下载
·加盟地方救援
·
我要学维修
·
电子书下载
进入论坛 地图
教程 | 技巧 | 笔记本 | 安全 | 网络故障 | 建站经验 | 维修资料 | 行情 | Vista | Win Xp | 手机 | MP3 | DVDC | Q Q | 评测 | DIY | 厂商 | 源码 | 病毒 | 数据恢复
[菜鸟学院] 操作系统 程序设计 网站开发 图像动画 办公软件 [故障查询] CPU 主板 硬盘 内存 显示器 打印机 光驱 显卡 [PC电子书] 软件教程 硬件技术 数据理论 网络技术
【救援中心俱乐部】
120急诊室  菜鸟学院  视频教程
俱乐部活动 软件世界  操作系统
维修资料   网络世界  网站建设
笔记本专栏 硬件世界  聊天专栏
网友靓照   个人专栏  原创交流
灌水乐园   贴图中心  游戏世界
当前位置:首页 > 菜鸟学院 > 编程开发 > C++ > 正文

浅谈C++/CLI中引用类型的栈对象
   2007-10-21 9:13:27 来源: 进入论坛 添加到收藏夹

在工作中使用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());

 
打印】【电脑俱乐部】【电脑视频】【电脑故障】【电脑学院】【电子书】【关闭
精彩视频教程推荐
电子书下载
推荐阅读
·Fireworks打造精致个性的Vista样
·Vista初级使用技巧及故障总结
·服务器升级故障及其解决方法
·保证Windows操作系统无毒技巧两则
·不用光盘也能找回系统的完璧之身
·08年互联网领袖扑克 马云蝉联黑桃
·IT市场趋势 1名员工1条狗成1个工
·笔记本网络“走亲”求便捷
·Windows XP下27招释放C盘空间技巧
·微软将精简Windows 7内置程序
·利用根区作用修复主板BIOS
·BIOS芯片物理损坏另类维修
·数字万用表的使用
·电源芯片检测方法
·如何判断上管下管
·Windows 2008下IIS7设置FTP的技巧

视频教程
EasyBoot制作双系统启 EasyBoot制作WinodwsX
最新新闻
·Fireworks打造精致个性的Vista样式按
·Vista初级使用技巧及故障总结
·服务器升级故障及其解决方法
·保证Windows操作系统无毒技巧两则 
·不用光盘也能找回系统的完璧之身
·08年互联网领袖扑克 马云蝉联黑桃A 
·IT市场趋势 1名员工1条狗成1个工厂
·笔记本网络“走亲”求便捷

装机必备软件下载
 
关于我们 | 合作媒体 | 版权声明 | 联系方式 | 意见反馈 | 广告业务 | 网站地图 | 急救中心

Copyright © 2003--2007 中国电脑援救中心版权所有
鲁ICP备05000605号