本文将给大家讲解一下 Visual C++中如何 删除托管对象、包装库及其他,大家在实际开发中可以做个参考。

  问:能否告诉我,在托管 C++ 中,使用 delete 操作符销毁托管对象是否安全?

  Bernie Sanders

  答:是安全的,可以在托管 C++ 中删除托管对象,不过要知道,delete 所做的就是调用对象的析构函数,所以必须显式定义它。调用 delete 并没有释放对象的存储空间。只有垃圾回收器才能够释放存储空间。图 1 所示的是一个简单的程序,它定义了一个托管类,这个类有一个析构函数,当运行这个析构函数时会显示一条消息。TESTDTOR 分配了两个 ManagedClass 实例。它显式删除第一个实例,但没有删除第二个。当您运行 TESTDTOR 时,就会得到如下所示的结果:

以下是引用片段:
  Begin main
  ManagedClass(04A712D4)::ctor
  ManagedClass(04A712D4)::dtor
  ManagedClass(04A712E0)::ctor
  End main
  ManagedClass(04A712E0)::dtor

  它表明当 delete 语句执行时,第一个对象的析构函数就会立即执行,而第二个对象(位于 04A712E0)并没有被销毁,直到控制离开 main,系统终止代码调用垃圾回收器释放未完成对象时才被销毁。

  图 2 testdtor 的重要部分

  要是对 .NET 环境中所发生的事情不确定,随时可以编写一些代码,对其进行编译,然后检查生成的 Microsoft 中间语言 (MSIL)。如图 2 所示,定义一个析构函数会使编译器生成两个方法:一个是 Finalize 方法,它包含您的实现(在本例中为调用 printf);另一个是 __dtor 方法,它调用 System.GC::SuppressFinalize,然后调用 Finalize。当您删除一个对象时,编译器会调用这个特定的 __dtor 方法。如果您带 /FAs 参数编译 TESTDTOR,产生随源代码列出的汇编语言,您就会发现 delete 语句按照以下方式进行编译:

以下是引用片段:
  delete pmc;
  ldloc.0 ; _pmc$
  call ..1ManagedClass@@$$FQ$AAM@XZ

  那些奇怪的神秘符号就是析构函数 (__dtor) 的托管名称。

  经验丰富的 C++ 编程人员也可能会疑惑不解,想知道如果调用 delete 不释放对象,那调用它有什么用呢?这个问题提得好。调用 delete 的唯一目的是回收类使用的任何非托管资源。例如,如果您的对象打开文件或创建一个数据库连接,则可以编写一个析构函数,当对象使用完毕时,可以用这个析构函数关闭它的资源,然后使用 delete 来调用它。释放托管类中的资源的更好方式是通过实现 Dispose 模式、IDisposable 和 auto_dispose 模式(如果您采用托管 C++ 编写)来调用它。有关更多信息,请参考 Tomas Restrepo 在 2002 年 2 月的 MSDN?Magazine 中撰写的“Tips and Tricks to Bolster Your Managed C++ Code in Visual Studio .NET”。

  如果您实现 dispose 模式,.NET 的其他用户就可以使用它。如果您在析构函数中进行清理工作,其他语言就无法显式调用您执行清理工作的代码。在 C# 和 Visual Basic 中没有 delete 操作符。

  所以虽然您可以调用 delete 来调用您的析构函数,但不提倡将执行清理工作的代码放在析构函数中。较好的方法是实现 IDisposable,所有的语言都可以使用它。不过要注意,这种行为在 Visual C++? 2005 中有所变化。有关更多信息,请参考 Andy Rich 在 Deterministic Finalization IV - Benefits, part II 中关于 deterministic finalization 的讨论,以及当前的 C++/CLI Language Specification Standard。

  问:我有一个非托管函数,它返回一个包含 char* 字符串的链接列表:

以下是引用片段:
  struct blah {
  int a, b;
  char *a, *b;
  struct blah *next;
  };
  struct blah *getmystruct();

  因为 getmystruct() 分配了内存,所以当我使用完这个函数后,我需要调用 freemystruct(struct blah *b)。我试图生成一个包装,将它转换成托管类型的集合,但我不知道当这些指针需要释放时如何处理它们。您能指点我一下吗?

钢琴王子 ぎ孤独浪子ぎ 丽日和风/jd 同在天涯 ヤ繏擇ɑ愛伱 ╲ˊ.輪迴. 蕭遙☆朤髭 井中月/tp ▕&掛唸° | 舞~▲★~動 轻笑 。 raffle /‘糸統消息/ ヾぺ靈戀ズ♂ βrave Boy *红海* o2jam 叼煙d尐P孩 ǐ灆┊樰狐゛ 篍天dě諷 嬲你滴滴针蚤 蓝天ぁ的祁视 ⒈哖逅ˇ… ヴ梦潇泓波 永恒的诺言 ˊ谜薍﹏丶 ¤濸嗨鎦響◎ ヤ蓜ミ角﹖。 《铭簰娚朲》 ..↘我 .︶ㄣ鱌尐ǜ 悔 囧♀ 缘 ♀囧 ??昣愛恛忔х 程琪 20〇9莪娶祢 西门吹泡泡 栤葑Dě專情 ╰☆←珦祐赱 &野/mg百合 ◇◆.佐.铒﹎ 傷/aiq悩荕﹖ 〥.〥 吥洅泘嗳 冷月 唯叶 ︵St〇p戀﹏ QQ/mn小天使 _縞縞鎭 心情马桶 Sparerib小生 Ⅲ朝メ飘逸ジ 秋雨 《{( )}》 mai 花妖芭比 路西法 【彭☆少】 ㊣魂㊣ ~寶☆崽~b哭 L.-_-# 為妳╃→心動 右耳逝去爱 黑色幽默 ヤ`僮孓 你是我的特例 丑小鸭 倾城→恋 Wing ゛癡⌒礙 梅川&内酷 繒→戀過/xs ぜ3歲が亼粅 縌鎏魚oο/lh _べ小宝☆. ‘私乆專屬 -,潵啦嘿哟° 寻~*  lorlin 死亡降临 §阳光男孩§ じ☆ve豪 oO黄天明Oo 嗜血残鹰 そ靈號黨舗ひ ヤ骑士の忠诚 ﹊寳寳佉褕歡 一晴空 寳少 ざ(_蒍祢戀伱 娟灬怺遠哒愛 V埪墹殺掱げ 小矮人 5chao@ 拿什么去经营 ╱╳灬萭衹鹤 ↘流星dè泪 ·羽·新· 哆唻M童衣阁 γ?ǒ?の航 ︷繒俓撮坏ヤ ☆鎏曐^o^☆ 心有灵犀 傷心ん楓枼 星期八值班 乄酷酷哋尐鱻 壊ㄨiǎo孩? 忘却的纪念 べ`鈊巳凍_oo "━ 活死人 '.縵縵' 东轩☆/:P 極度鬧心/dk 唓佡de沐腢 风逍天 憂鬱 ╰ァ認眞嗳妳 ╭ァ茳會軍ヤ .丶粉z!° 〃锘の唁⒅、 貝者 衤申 呼呼猪/aiq 笑面︶ㄣ二郎 耲壊ャ孩孓氣 ˊ;嗯.娶莪﹖ 狗狗的小主人 ????艷翎 忠義★無名 我爱足球 尐蕣鱫╭╮ 奶油小生 独善无忧 づ雲談風清つ ☆從新開始☆ °﹡尋 ミ壊壊ヤDê _10086咨询 (_菰獨奶嘴 寻宝 敟當/莪de愛 浪漫的蓝影子 衤果`ㄖ垂`衶 ♂YQ缘倩♀ ..日式宅男`` 己 ┧醜囡↖ ^@^趴趴*_* 七月 `′鉺乄 ﹎訞.釹_ 獨领峰彩 メ君臨天下メ _ . 嘜釾赯|_ 才思/aiq敏捷 *゛ 酃ぃ孁▽╰亟 無唁啲の傑 僾/love伱

Visual C++中删除托管对象、包装库及其他相关推荐

  1. [转]在Visual C++中以错误的顺序链接 CRT 库和 MFC 库时出现 LNK2005 错误

    症状 当 C 运行时 (CRT) 库和 Microsoft 基础类 (MFC) 库的链接顺序有误时,可能会出现以下 LNK2005 错误之一: nafxcwd.lib... 当 C 运行时 (CRT) ...

  2. Visual Stdio 无法直接启动带有“类库输出类型”的项目若要调试此项目,请在此解决方案中添加一个引用库项目的可执行项目。将这个可执行项目设置为启动项目!

    Visual Stdio 无法直接启动带有"类库输出类型"的项目若要调试此项目,请在此解决方案中添加一个引用库项目的可执行项目.将这个可执行项目设置为启动项目! 参考文章: (1) ...

  3. win7删除计算机库文件,win7怎么将“库”从资源管理器导航栏中删除【图文】

    win7系统打开资源管理器可以看到左侧导航栏中会有"库"."计算机"."网络"等选项,很多用户觉得"库"根本就没有用到, ...

  4. Visual Studio 2013或2015工程属性中包含目录和库目录的添加方法,附加依赖项,相对路径

    参考文章:包含目录.库目录.附加包含目录.附加库目录.附加依赖项之详解 https://blog.csdn.net/u012043391/article/details/54972127 参考文章:V ...

  5. 删除右键菜单中的选项:在Visual Studio中打开

    删除右键菜单中的选项:在Visual Studio中打开 1. 通过新增注册表中项目来解决 按下Win + R键 > 输入regedit > OK > 系统会跳出一个弹框,选择&qu ...

  6. Android 核心已经从 Linux kernel 代码库中删除

    Greg Kroah-Hartman Novell 的开发人员,他主要负责维护 Linux 操作系统的启动,USB和驱动核心,近日他表示谷歌 Android 系统的驱动核心 已经从 Linux ker ...

  7. Visual Studio中JavaScript智能提示(即引用JS库)

    Visual Studio中JavaScript智能提示(即引用JS库) 一.直接在JavaScript文件顶部输入代码,直接引用JavaScript文件类型库 /// <reference p ...

  8. Windows10系统下Visual Studio 2017 使用VISP视觉库中的AprilTags进行实时姿态识别

    Windows10系统下Visual Studio 2017 使用VISP视觉库中的AprilTags进行实时姿态识别 前言 环境配置 报错记录 相关C++代码介绍 代码参数说明 运行结果 运行速度 ...

  9. Visual Studio中使用开源二维码QR库libqr

    分享一个轻巧的开源二维码QR库libqr,源码可以从GitHub上下载.下面我们详细说明一下如何在Visual Studio中编译使用. 1. 源码下载 地址:https://github.com/r ...

最新文章

  1. 深造率超70%!这所顶尖大学毕业生:不读研怎么找工作?
  2. Android屏幕信息获取
  3. VTK:PolyData之VertexConnectivity
  4. python转换函数使用_python进制转换函数代码的使用
  5. 程序员面试金典 - 面试题 02.08. 环路检测(快慢指针)
  6. 前端JS笔试面试题目
  7. mac os 开启redis_【漫画】谈谈Redis持久化
  8. 刚学vue,写的一个入门demo,时光网
  9. pandas DataFrame 根据多列的值做判断,生成新的列值
  10. 高电压与绝缘技术方向,代做EMTP,ATP输电线路防雷仿真
  11. javascript异步编程之回调函数
  12. 教育知识与能力-第七章 中学德育
  13. Window Flag 含义
  14. 希尔排序解析实例实现
  15. 金德的齐瓦,能否成为金德的温格?_原水_新浪博客
  16. pdb文件及其作用(转)
  17. 解决win10下安装typescript后仍报“tsc不是内部或外部命令...”的问题
  18. plink质控及转换文件、admixture软件学习记录
  19. 微信小程序,实现首页弹框活动引导功能
  20. 微信小程序page页面下有多余空白区域(解决方法)

热门文章

  1. 使用scikit-learn对鸢尾花进行分类
  2. 查看oracle数据库服务器配置,Oracle数据库监听配置
  3. Druid+Oracle连接超时关闭问题
  4. 小白知识:什么是云计算?
  5. Linux ls指令
  6. 【upc】山路 (ghat) | 思维、最短路
  7. selenium使用
  8. Qualcomm平台 AEE运行机制的深入剖析
  9. 巴什游戏入门(Bash Game)
  10. xgboost处理二分类问题原理