引用C++/CLI中的栈对象总结

C++/CLI是.NET平台下的C++语言,当然ISO C++的诸多语法保留下来,栈对象便是其一,但是他的语义发生了变化,通过处理对象的作用返回就会自动释放其所占用的内存。

创新互联建站坚持“要么做到,要么别承诺”的工作理念,服务领域包括:网站建设、网站制作、企业官网、英文网站、手机端网站、网站推广等服务,满足客户于互联网时代的余庆网站设计、移动媒体设计的需求,帮助企业找到有效的互联网解决方案。努力成为您成熟可靠的网络建设合作伙伴!

大家都知道.NET平台与win32平台最大的差别是托管内存,对C#了解的同志都知道,在C#里面分有值类型(value type)与引用类型(refrence type),值类型对象均分配在栈中,引用类型的都会分配在托管堆中。

换句话说就是对象的类型决定了其分配的位置,栈还是托管堆。栈内存的回收还是与以往一样,是确定性的,托管堆内存的回收是由垃圾回收器来负责。然而在这样的内存模型中,MyClass myClass;这个语句在C++/CLI中的语义会是什么呢?

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

 
 
 
  1. private:
  2. class SingleTonTranslator
  3. {
  4. public:
  5. SingleTonTranslator()
  6. {
  7. signal(SignalExceptionClass::GetSignalNumber(), 
  8. SignalHandler);
  9. }
  10. static void SignalHandler(int)
  11. {
  12. throw SignalExceptionClass();
  13. }
  14. };
  15. public:
  16. SignalTranslator()
  17. {
  18. static SingleTonTranslator s_objTranslator;
  19. }
  20. };
  21. // An example for SIGSEGV
  22. class SegmentationFault : public ExceptionTracer, public 
  23. exception
  24. {
  25. public:
  26. static int GetSignalNumber() {return SIGSEGV;}
  27. };
  28. SignalTranslator 
  29. g_objSegmentationFaultTranslator;
  30. // An example for SIGFPE
  31. class FloatingPointException : public ExceptionTracer, public 
  32. exception
  33. {
  34. public:
  35. static int GetSignalNumber() {return SIGFPE;}
  36. };

但看了无数篇阐述C++复杂性的文章,和争论C++复杂性的吐沫星子(包括我前段时间写的两篇关于C++的总结)。我始终都有一个感觉——没分析透,就跟盲人摸象一样。正如“Why C++”的一位读者批评的。

在文章里面没有写明到底哪些是C++的“非本质复杂性”。当然,我自己凭感觉就能知道,而接触C++一段时间的人大致也能知道,但新手乃至非新手则对我所谓的“非本质复杂性”根本没有一个具体的认识,这就使得那篇“Why C++”脱离了原本的意图——面向所有C++使用者和学习者。

同样的原因,在写了“你应当如何学习C++/CLI一文之后,当孟岩先生邀请我给《程序员》写一个系列的文章,介绍一下我在接触C++的过程中的态度和认识转变时,我虽然非常高兴的答应了。

但直到现在3个月过去了还是颗粒无收。为什么?因为我觉得真正本质的问题没有被清晰的触摸到;所以直到现在我都没有动笔,免得废话说了一大堆,除了能被当成小说读读之外,对真正考虑是否要学习乃至使用C++/CLI的人未必有什么实际用处。

本文名称:引用C++/CLI中的栈对象总结
转载来于:http://www.shufengxianlan.com/qtweb/news0/109450.html

网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联