C++/CLI是.NET平台下的C++语言,当然ISO C++的诸多语法保留下来,栈对象便是其一,但是他的语义发生了变化,通过处理对象的作用返回就会自动释放其所占用的内存。
大家都知道.NET平台与win32平台最大的差别是托管内存,对C#了解的同志都知道,在C#里面分有值类型(value type)与引用类型(refrence type),值类型对象均分配在栈中,引用类型的都会分配在托管堆中。
换句话说就是对象的类型决定了其分配的位置,栈还是托管堆。栈内存的回收还是与以往一样,是确定性的,托管堆内存的回收是由垃圾回收器来负责。然而在这样的内存模型中,MyClass myClass;这个语句在C++/CLI中的语义会是什么呢?
众所周知,高级语言得以出现,主要归功于编译器,语义会是怎么样,当然也取决于编译器的编译结果。下面通过一些简单的代码进行讲解,请留意代码中的注释
- private:
- class SingleTonTranslator
- {
- public:
- SingleTonTranslator()
- {
- signal(SignalExceptionClass::GetSignalNumber(),
- SignalHandler);
- }
- static void SignalHandler(int)
- {
- throw SignalExceptionClass();
- }
- };
- public:
- SignalTranslator()
- {
- static SingleTonTranslator s_objTranslator;
- }
- };
- // An example for SIGSEGV
- class SegmentationFault : public ExceptionTracer, public
- exception
- {
- public:
- static int GetSignalNumber() {return SIGSEGV;}
- };
- SignalTranslator<SegmentationFault>
- g_objSegmentationFaultTranslator;
- // An example for SIGFPE
- class FloatingPointException : public ExceptionTracer, public
- exception
- {
- public:
- static int GetSignalNumber() {return SIGFPE;}
- };
但看了无数篇阐述C++复杂性的文章,和争论C++复杂性的吐沫星子(包括我前段时间写的两篇关于C++的总结)。我始终都有一个感觉——没分析透,就跟盲人摸象一样。正如“Why C++”的一位读者批评的。
在文章里面没有写明到底哪些是C++的“非本质复杂性”。当然,我自己凭感觉就能知道,而接触C++一段时间的人大致也能知道,但新手乃至非新手则对我所谓的“非本质复杂性”根本没有一个具体的认识,这就使得那篇“Why C++”脱离了原本的意图——面向所有C++使用者和学习者。
同样的原因,在写了“你应当如何学习C++/CLI一文之后,当孟岩先生邀请我给《程序员》写一个系列的文章,介绍一下我在接触C++的过程中的态度和认识转变时,我虽然非常高兴的答应了。
但直到现在3个月过去了还是颗粒无收。为什么?因为我觉得真正本质的问题没有被清晰的触摸到;所以直到现在我都没有动笔,免得废话说了一大堆,除了能被当成小说读读之外,对真正考虑是否要学习乃至使用C++/CLI的人未必有什么实际用处。
【编辑推荐】