WEB开发网
开发学院软件开发VC Visual C++中删除托管对象、包装库及其他 阅读

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

 2008-11-12 19:26:24 来源:WEB开发网   
核心提示:问:能否告诉我,在托管 C++ 中,Visual C++中删除托管对象、包装库及其他,使用 delete 操作符销毁托管对象是否安全? Bernie Sanders答:是安全的,可以在托管 C++ 中删除托管对象,编译器会调用这个特定的 __dtor 方法,如果您带 /FAs 参数编译 TESTDTOR,不过要知道,d

问:能否告诉我,在托管 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,系统终止代码调用垃圾回收器释放未完成对象时才被销毁。

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

图 2 testdtor 的重要部分

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

1 2 3 4 5 6  下一页

Tags:Visual 删除 托管

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接