科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道应用软件浅谈C++/CLI中引用类型的栈对象

浅谈C++/CLI中引用类型的栈对象

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

本文通过一些简单的代码讲解C++/CLI中引用类型的栈对象,来跟大家一起学习一下。

作者:瞭望大海的渔夫! 来源:博客园  2007年9月13日

关键字: C++ CLI 引用类型 栈对象

  • 评论
  • 分享微博
  • 分享邮件

在本页阅读全文(共19页)

对于有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}

查看本文来源

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章