什么是托管C++
托管是NET的一个专门概念,它倡导一种新的编程理念,因此我们完全可以把“托管”视为“NET”。由托管概念所引发的C++
应用程序
包括
托管代码
、
托管数据
和托管类三个组成部分。
托管代码
Net环境提供了许多核心的运行(RUNTIME)服务,比如
异常处理
和
安全策略
。为了能使用这些服务,必须要给
运行环境
提供一些信息
代码
(
元数据
),这种代码就是托管代码。所有的C#、VBNET、JScriptNET默认时都是托管的,但Visual
C++默认时不是托管的,必须在
编译器
中使用命令行选项(/CLR)才能产生托管代码。
托管数据
与托管代码密切相关的是托管数据。托管数据是由公共语言运行的垃圾回收器进行分配和释放的数据。默认情况下,C#、Visual
Basic
和
JScriptNET
数据是托管数据。不过,通过使用特殊的
关键字
,C#
数据可以被
标记
为非托管数据。Visual
C++数据在默认情况下是非托管数据,即使在使用
/CLR
开关时也不是托管的。
托管类
尽管Visual
C++数据在默认情况下是非托管数据,但是在使用C++的托管扩展时,可以使用“__gc”关键字将类标记为托管类。就像该名称所显示的那样,它表示类
实例
的
内存
由垃圾回收器管理。另外,一个托管类也完全可以成为
NET
框架的成员,由此可以带来的好处是,它可以与其他语言编写的类正确地进行相互 *** 作,如托管的
C++类
可以从Visual
Basic类继承等。但同时也有一些限制,如托管类只能从一个
基类
继承等。
托管概念所引发的C++应用程序包括托管代码、托管数据和托管类
三个组成部分。
(1) 托管代码:Net环境提供了许多核心的运行(RUNTIME)服务,比如异常处理和安全策略。为了能使用这些服务,必须要给运行环境提供一些信息代码(元数据),这种代码就是托管代码。所有的C#、默认时都是托管的,但Visual C++默认时不是托管的,必须在编译器中使用命令行选项(/CLR)才能产生托管代码。
(2) 托管数据:与托管代码密切相关的是托管数据。托管数据是由公共语言运行的垃圾回收器进行分配和释放的数据。默认情况下,C#、Visual Basic 和 数据是托管数据。不过,通过使用特殊的关键字,C# 数据可以被标记为非托管数据。Visual C++数据在默认情况下是非托管数据,即使在使用 /CLR 开关时也不是托管的。
(3) 托管类:尽管Visual C++数据在默认情况下是非托管数据,但是在使用C++的托管扩展时,可以使用“__gc”关键字将类标记为托管类。就像该名称所显示的那样,它表示类实例的内存由垃圾回收器管理。另外,一个托管类也完全可以成为 NET 框架的成员,由此可以带来的好处是,它可以与其他语言编写的类正确地进行相互 *** 作,如托管的C++类可以从Visual Basic类继承等。但同时也有一些限制,如托管类只能从一个基类继承等。需要说明的是,在托管C++应用程序中既可使用托管类也可以使用非托管类。这里的非托管类不是指标准C++类,而是使用托管C++语言中的__nogc关键字的类。
区别:1C语言、C++、C#准确的说,是三种计算机编程语言。
2C面向过程,开发非托管程序,编译成exe是二进制可执行文件,不可跨平台。C++面向对象,开发托管和非托管程序,编译成exe是二进制可执行文件,不可跨平台。C#面向对象,开发托管程序,编译成exe是中间语言。
3C语言既具有高级语言的特点,又具有汇编语言的特点。C语言的源代码基本上可以非常容易地对应到汇编代码,而且可以不需要什么运行时环境的支持。C++是一种静态数据类型检查的,支持多重编程范式的通用程序设计语言。
C#的特点就是:抽象层次高且基本只有一种(面向对象的),运行时支持丰富(垃圾回收等),类库丰富。
4C的特点,简单容易编译,灵活贴近底层。它可以作为工作系统设计语言,编写系统应用程序,也可以作为应用程序设计语言,编写不依赖计算机硬件的应用程序。因此,它的应用范围广泛,不仅仅是在软件开发上,而且各类科研都需要用到C语言,具体应用比如单片机以及嵌入式系统开发。
扩展资料:
计算机语言包括机器语言、汇编语言、高级语言。
机器语言是用二进制代码表示的计算机能直接识别和执行的一种机器指令的集合。它是计算机的设计者通过计算机的硬件结构赋予计算机的 *** 作功能,比如汇编语言(assembly language)。机器语言具有灵活、直接执行和速度快等特点。高级语言比较容易识记和理解,像C B语言等。
参考资料:
C语言 百度百科
c#语言 百度百科
C++ 百度百科
托管与非托管混合编程部分
这部分是最重要,也是最难的。VisualStudio环境提供了一些头文件来帮助开发者链接这些关键词。
#include <vcclrh>
但是,并非就到这儿就结束了。我们还需要小心涉及的一些陷阱,尤其是是CLR(托管代码)和native(非托管代码)一些关键词之间数据的传递。
以下是个类的头文件输出一个托管的部分
#pragma once
#ifdef NATIVEDLL_EXPORTS
#define NATIVEDLL_API __declspec(dllexport)
#else
#define NATIVEDLL_API __declspec(dllimport)
#endif
#include <string>
using namespace std;
#ifdef _UNICODE
typedef wstring tstring;
#else
typedef string tstring;
#endif
class NATIVEDLL_API CPerson
{
public:
// Initialization
CPerson(LPCTSTR pszName, const SYSTEMTIME birthDate);
virtual ~CPerson();
// Accessors
unsigned int get_Age() const;
tstring get_BirthDateStr() const;
SYSTEMTIME get_BirthDate() const;
private:
// Embedded wrapper of an instance of a CLR class
// Goal: completely hide CLR to pure unmanaged C/C++ code
void m_pPersonClr;
};
强调一点,尽量在头文件里保证只有非托管代码,混合编程在cpp中去实现,数据的传递。比如: 应该尽量避免使用vcclrh中的函数, 进行混合编程。这就是为什么定义一个void指针来包装CLR对象。
托管资源指的是NET可以自动进行回收的资源,主要是指托管堆上分配的内存资源。托管资源的回收工作是不需要人工干预的,有NET运行库在合适调用垃圾回收器进行回收。
非托管资源指的是NET不知道如何回收的资源,最常见的一类非托管资源是包装 *** 作系统资源的对象,例如文件,窗口,网络连接,数据库连接,画刷,图标等。这类资源,垃圾回收器在清理的时候会调用ObjectFinalize()方法。默认情况下,方法是空的,对于非托管对象,需要在此方法中编写回收非托管资源的代码,以便垃圾回收器正确回收资源。
在NET中,ObjectFinalize()方法是无法重载的,编译器是根据类的析构函数来自动生成ObjectFinalize()方法的,所以对于包含非托管资源的类,可以将释放非托管资源的代码放在析构函数。
注意,不能在析构函数中释放托管资源,因为析构函数是有垃圾回收器调用的,可能在析构函数调用之前,类包含的托管资源已经被回收了,从而导致无法预知的结果。
本来如果按照上面做法,非托管资源也能够由垃圾回收器进行回收,但是非托管资源一般是有限的,比较宝贵的,而垃圾回收器是由CRL自动调用的,这样就无法保证及时的释放掉非托管资源,因此定义了一个Dispose()方法,让使用者能够手动的释放非托管资源。Dispose()方法释放类的托管资源和非托管资源,使用者手动调用此方法后,垃圾回收器不会对此类实例再次进行回收。Dispose()方法是由使用者调用的,在调用时,类的托管资源和非托管资源肯定都未被回收,所以可以同时回收两种资源。
Microsoft为非托管资源的回收专门定义了一个接口:IDisposable,接口中只包含一个Dispose()方法。任何包含非托管资源的类,都应该继承此接口。
在一个包含非托管资源的类中,关于资源释放的标准做法是:
(1) 继承IDisposable接口;
(2) 实现Dispose()方法,在其中释放托管资源和非托管资源,并将对象本身从垃圾回收器中移除(垃圾回收器不在回收此资源);
(3) 实现类析构函数,在其中释放非托管资源。
在使用时,显示调用Dispose()方法,可以及时的释放资源,同时通过移除Finalize()方法的执行,提高了性能;如果没有显示调用Dispose()方法,垃圾回收器也可以通过析构函数来释放非托管资源,垃圾回收器本身就具有回收托管资源的功能,从而保证资源的正常释放,只不过由垃圾回收器回收会导致非托管资源的未及时释放的浪费。
在NET中应该尽可能的少用析构函数释放资源。在没有析构函数的对象在垃圾处理器一次处理中从内存删除,但有析构函数的对象,需要两次,第一次调用析构函数,第二次删除对象。而且在析构函数中包含大量的释放资源代码,会降低垃圾回收器的工作效率,影响性能。所以对于包含非托管资源的对象,最好及时的调用Dispose()方法来回收资源,而不是依赖垃圾回收器。
上面就是NET中对包含非托管资源的类的资源释放机制,只要按照上面要求的步骤编写代码,类就属于资源安全的类。
下面用一个例子来总结一下NET非托管资源回收机制:
Public class BaseResource:IDisposable
{
PRivate IntPtr handle; // 句柄,属于非托管资源
Private Componet comp; // 组件,托管资源
Private bool isDisposed = false; // 是否已释放资源的标志
PublicBaseResource
{
}
//实现接口方法
//由类的使用者,在外部显示调用,释放类资源
Publicvoid Dispose()
{
Dispose(true);// 释放托管和非托管资源
//将对象从垃圾回收器链表中移除,
// 从而在垃圾回收器工作时,只释放托管资源,而不执行此对象的析构函数
GCSuppressFinalize(this);
}
//由垃圾回收器调用,释放非托管资源
~BaseResource()
{
Dispose(false);// 释放非托管资源
}
//参数为true表示释放所有资源,只能由使用者调用
//参数为false表示释放非托管资源,只能由垃圾回收器自动调用
//如果子类有自己的非托管资源,可以重载这个函数,添加自己的非托管资源的释放
//但是要记住,重载此函数必须保证调用基类的版本,以保证基类的资源正常释放
Protectedvirtual void Dispose(bool disposing)
{
If(!thisdisposed)// 如果资源未释放 这个判断主要用了防止对象被多次释放
{
If(disposing)
{
CompDispose();// 释放托管资源
}
closeHandle(handle);// 释放非托管资源
handle= IntPtrZero;
}
thisdisposed= true; // 标识此对象已释放
}
}析构函数只能由垃圾回收器调用。
Despose()方法只能由类的使用者调用。
在C#中,凡是继承了IDisposable接口的类,都可以使用using语句,从而在超出作用域后,让系统自动调用Dispose()方法。一个资源安全的类,都实现了IDisposable接口和析构函数。
提供手动释放资源和系统自动释放资源的双保险。
这个还不是目前的C++标准,不过visual studio 2005里已经有了。
托管主要用于指针?托管指针好像是其内存由编译器负责释放,非托管指针就是一般的指针了。(内存的自动释放是C++的一个大问题,目前在语言层面上没有解决方法,解决方法集中在库上,比如boost的智能指针类)
问题一:工程托管项目什么意思 工程托管简单的说就是就此工程自己没有相应的资质或技术力量,委托有相应资质或技术力量的单位进行管理。
问题二:i托管是什么意思?它有哪些项目? 您的帖子太好看了!我愿意一辈子看下去!
问题三:托管项目家长服务组意见怎么写 1、建立渠道,了解家长真正需求
幼儿园应及时听取家长对保教工作的意见和建议,不应该等到问题严重之时,才想到要专门组织人员采取补救措施。因此,除了每学期集中听取家长意见之外,应创设多种途径及时收集家长对幼儿园保教工作的意见和建议。可利用家长信箱、家长咨询接待日、活动反馈、班级家委会与园级家委会穿插活动、信息化交流平台等形式,有效形成家园互动的网络,加强家园联系。在及时了解家长需求和困惑的基础上,发挥各部门优势,采取积极有效的措施加大教育和宣传力度,激发教工参与家长工作的主动意识。
2、换位反思,争取效率最优化
每项工作完成后都应有反思过程,反思可以帮助人们总结最优化的做事经验,从而达到效益最大化。膳食满意度提升的案例中,正是通过全面反思,才会在了解家长真正需求的基础上,站在家长的立场上作换位思考,急为家长所急、想为家长所想,提供全方位的服务策略,把握点和面的结合度,以至达到最优化的效率,这是做好家长工作的关键。通过对家长工作的反思,我们意识到:由于家庭背景不同,孩子个性和习惯不同,家长对幼儿园的要求也不同。幼儿园应根据家长需求提供服务菜单,供家长根据自我意愿,自主选择参与项目,这样既不浪费家长的时间、又有效解决家长的不同问题。
3、以人为本,凸现人人参与管理
项目管理小组发挥了应有的作用,参与的人员最大限度地体现了自身价值,从而凸现出团队精神。但项目组长自聘人员组成的团队是否就是最佳团队呢通过反思总结大家认为:如果组长自聘人员与要求参与该项目人员两相结合,则更能发挥团队的作用。我们认为:主动要求参与的人员对此项目有兴趣、有热情,可能还有经验,她们的主动性和积极性应该更高,这样的团队一定会更具活力。教工主动参与管理的意识也可在其中逐步培养,“人人参与管理”的理念可深入地落实。
问题四:营销托管是什么概念? 营销托管是指企业将营销业务的全部或者部分项目委托给专业的企业咨询公司,咨询公司以企业组织的名义进行市场管理或项目实施。
企业通过契约形式,明确营销目标和市场投入,明确双方的权利和义务,借助专业咨询公司的资源优势和经营管理优势,实现企业快速突破的目标。营销托管是营销策划的行业升级,也是营销行业发展的必然产物。
问题五:何谓“开源项目托管”? 开源
是指原代码开放,具体说来就是免费,或者成本不高。个人使用免费,企业使用时需要支付相关费用
一般也指公开部分功能,需要使用全部功能需要支付相关费用
典型的开憨软件有Java Linux 等等就是开源软件,不过用开软件作出来的程序是有版权的
开源项目托管应该类似于软件外包吧,就是把某个开源项目交给别人去做
问题六:托管后项目如何审批 也许你的计算生活表面上看起来就是收发电子邮件和浏览网络,但是对于那些专业的数据用户来说,还要创建文件、表单、乏味的演示和以各种方式存储的信息。
问题七:什么是资金托管。 资金托管就是在项目甲乙等各方之外的一家具有资金托管资质的机构或银行,对项目中的资金流动进行实际 *** 作
问题八:什么是托管代码 在过去(只是几年前),使用C和C++编写代码的开发人员不得不自己进行内存管理。当不再需要已分配的内存空间时,必须将其释放,除非希望该内存被泄漏,内存泄漏将带来严重的性能问题。更糟糕的是因为直接处理指针,而它很容易破坏项目正在使用的内存。在很多情况下,这将导致很长时间的故障调试,因为通常实际看到出错的地方并不是内存初始被破坏的地方。人们认为C和C++语言难于掌握,主要是因为具有很多这种类型的问题。许多开发人员不愿意尝试C和C++,也是因为这个原因,他们尝试使用其他没有这些令人头痛问题的高级语言,例如Visual Basic。尽管这些新语言具有易用易学的优点,但也具有一些缺点。它们的性能无法与C和C++语言相比,在大多数情况下显得特别慢。另外,因为底层 *** 作系统是使用C++开发的,所以这些语言难以实现C++的所有功能。尽管可以使用它们处理很多非常好的工作,但是如果想要获得 *** 作系统的所有性能和优势,只能依靠自己。与NET运行库的第一个版本相比,NET的大多数内容都已经改变了。Microsoft公司几乎完全重新设计了一种新的API,竭力确保开发人员关心的问题都会被解决。这种新的运行库必须易学易用,快速高效,并且不存在令人头痛的内存管理问题。在本书中,将看到NET在这些方面的好处。托管代码 (managed code)由公共语言运行库环境(而不是直接由 *** 作系统)执行的代码。托管代码应用程序可以获得公共语言运行库服务,例如自动垃圾回收、运行库类型检查和安全支持等。这些服务帮助提供独立于平台和语言的、统一的托管代码应用程序行为。如C#非托管代码 (unmanaged code)在公共语言运行库环境的外部,由 *** 作系统直接执行的代码。如C++,C
问题九:局共管 托管 直管什么意思 你好!共同管理,委托其他单位或个人管理,直接进行管理。
以上就是关于请问什么是托管c++程序全部的内容,包括:请问什么是托管c++程序、什么是托管、c语言和c++和c#的区别等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)