zoukankan      html  css  js  c++  java
  • 浅议C /CLI的gcnew关键字

    http://west263.com/info/html/chengxusheji/C-C--/20080224/9240.html

    1. gcnew返回的是个句柄(Handle),而new返回的是实际的内存地址.

      2. gcnew创建的对象由虚拟机托管,而new创建的对象必须自己来管理和释放.
      当然,从程式员的角度来说,管他是句柄还是什么其他的东西,总跑不掉是对某块内存地址的引用,实际上我们都能够理解成指针.下面我们就写一段代码来测试一下好了.

    using namespace System;
    ref class Foo
    {
    public:
    Foo()
    {
    System::Console::WriteLine("Foo::Foo");
    }
    ~Foo()
    {
    System::Console::WriteLine("Foo::~Foo");
    }
    public:
    int m_iValue;
    };
    int _tmain()
    {
    int* pInt = new int;
    int^ rInt = gcnew int;
    Foo^ rFoo = gcnew Foo;
    delete rFoo;
    delete rInt;
    delete pInt;

    特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系

      我把调试的时候JIT编译的汇编代码择录了部分如下显示(请注意红色部分):

    int* pInt = new int;
    0000004c mov ecx,4
    00000051 call dword ptr ds:[03B51554h]
    00000057 mov esi,eax
    00000059 mov dword ptr [esp 18h],esi
    int^ rInt = gcnew int;
    0000005d mov ecx,788EF9D8h
    00000062 call FCFAF66C
    00000067 mov esi,eax
    00000069 mov dword ptr [esi 4],0
    00000070 mov edi,esi
    Foo^ rFoo = gcnew Foo;
    00000072 mov ecx,3B51768h
    00000077 call FCFAF66C
    0000007c mov esi,eax
    0000007e mov ecx,esi
    00000080 call dword ptr ds:[03B517ACh]
    00000086 mov dword ptr [esp 1Ch],esi
    delete rFoo;
    0000008a mov ebx,dword ptr [esp 1Ch]
    0000008e test ebx,ebx
    00000090 je 000000A4
    00000092 mov ecx,ebx
    00000094 call dword ptr ds:[03FD0028h]
    0000009a mov dword ptr [esp 14h],0
    000000a2 jmp 000000AC
    000000a4 mov dword ptr [esp 14h],0
    delete rInt;
    000000ac mov edx,edi
    000000ae mov ecx,788F747Ch
    000000b3 call FC8D20FD
    000000b8 mov ebp,eax
    000000ba test ebp,ebp
    000000bc je 000000D0
    000000be mov ecx,ebp
    000000c0 call dword ptr ds:[03FD0020h]
    000000c6 mov dword ptr [esp 10h],0
    000000ce jmp 000000D8
    000000d0 mov dword ptr [esp 10h],0
    delete pInt;
    000000d8 mov ecx,dword ptr [esp 18h]
    000000dc call dword ptr ds:[03B51540h] 
    !

      我们先看分配内存这部分的代码
      1.调用new方式分配


    int* pInt = new int;
    0000004c mov ecx,4
    00000051 call dword ptr ds:[03B51554h]


      能够看到,和以前在vc6中相同,分配内存的步骤如下:

      1. 首先把sizeof(int) = 4 放到ecx中

      2. 调用operator new 去分配4个字节

      3. 调用构造函数等等......(这里不是我们的重点)
    版权申明:本站文章均来自网络,如有侵权,请联系028-86262244-215 ,我们收到后立即删除,谢谢!
    特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有


    本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/carl2380/archive/2010/05/25/5622007.aspx

  • 相关阅读:
    vscode的go环境配置
    百度过的问题
    javascript判定两个对象是否相等
    chattr
    kubernetes ingress example
    docker 免 sudo
    build local kubernetes env
    go channel
    rpm install and uninstall
    fluentd v0.12 gem install fluent-plugin-webhdfs error
  • 原文地址:https://www.cnblogs.com/carl2380/p/2093281.html
Copyright © 2011-2022 走看看