• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            天下

            記錄修行的印記

            略談GCHandle【轉(zhuǎn)】



            略談GCHandle【轉(zhuǎn)】
            http://blog.163.com/vk_01313/blog/static/17219228200912491729457/
            我們在使用c#托管代碼時,內(nèi)存地址和GC回收那不是我們關(guān)心的,CLR已經(jīng)給我們暗箱操作。
            但是如果我們在c#中調(diào)用了一個非托管代碼,比如vc的DLL,而且他有個回調(diào)函數(shù),需要引用c#中的某個對象并操作,
            這時候你就得要小心了。
            要是非托管代碼中用到得托管代碼那個對象被GC給回收了,這時候就會報內(nèi)存錯誤。
            所以我們就要把那個對象“釘”住(pin),讓它的內(nèi)存地址固定,而不被垃圾回收掉,然后最后我們自己管理,自己釋放內(nèi)存,這時候就需要GCHandle,來看個msdn上的例子:


            using System.Runtime.InteropServices;

            namespace ConsoleApplication1
            {

                //C#
                public delegate bool CallBack(int handle, IntPtr param);
                public class LibWrap
                {
                    [DllImport("user32.dll")]
                    public static extern bool EnumWindows(CallBack cb, IntPtr param);
                }

                class Program
                {
                    static void Main(string[] args)
                    {
                        TextWriter tw = System.Console.Out;
                        GCHandle gch = GCHandle.Alloc(tw);
                        CallBack cewp = new CallBack(CaptureEnumWindowsProc);
                        LibWrap.EnumWindows(cewp, (IntPtr)gch);
                        gch.Free();
                        Console.Read();

                    }
                    private static bool CaptureEnumWindowsProc(int handle, IntPtr param)
                    {
                        GCHandle gch = (GCHandle)param;
                        TextWriter tw = (TextWriter)gch.Target;
                        tw.WriteLine(handle);
                        return true;
                    }

                } 
            }


            對上面的代碼,略加解釋:gch 會釘住(pin)tw這個對象,使其不受GC管理,告訴它,以后你崩管我,我也不用給你上稅,其實管理權(quán)已經(jīng)給gch,通過free來釋放內(nèi)存。
            這種情況主要用在托管和非托管代碼交互的時候,防止內(nèi)存泄露來使用GCHandle。

            posted on 2015-12-21 18:36 天下 閱讀(945) 評論(0)  編輯 收藏 引用 所屬分類: C#

            <2014年4月>
            303112345
            6789101112
            13141516171819
            20212223242526
            27282930123
            45678910

            導(dǎo)航

            統(tǒng)計

            常用鏈接

            留言簿(4)

            隨筆分類(378)

            隨筆檔案(329)

            鏈接

            最新隨筆

            搜索

            最新評論

            国产一区二区精品久久岳| 亚洲国产精品一区二区久久| 久久久亚洲欧洲日产国码二区| 婷婷久久综合九色综合绿巨人| 婷婷久久综合九色综合98| 久久久久亚洲Av无码专| 久久99精品国产自在现线小黄鸭| 久久精品国产清自在天天线| 久久精品国产亚洲综合色| 麻豆AV一区二区三区久久| 亚洲中文字幕无码一久久区| 一本色综合久久| 99蜜桃臀久久久欧美精品网站| 久久午夜夜伦鲁鲁片免费无码影视| 中文国产成人精品久久亚洲精品AⅤ无码精品 | 精品久久久久久久无码| 久久久久亚洲AV无码麻豆| 久久久精品人妻一区二区三区蜜桃| 乱亲女H秽乱长久久久| 韩国三级大全久久网站| 伊人色综合久久天天| 日韩一区二区三区视频久久| 久久久久久久免费视频| 久久人人爽人人爽人人片AV东京热| 久久这里有精品| 亚洲中文久久精品无码ww16| 久久国产精品一国产精品金尊| 久久人人爽人人爽人人片av高请| 久久AV高清无码| 91精品日韩人妻无码久久不卡| 国产精品综合久久第一页| 无码人妻久久一区二区三区蜜桃| 久久天天躁狠狠躁夜夜avapp| 狠狠色噜噜色狠狠狠综合久久 | 久久青青草原精品影院| 99久久国产综合精品成人影院| 亚洲国产综合久久天堂| 色综合久久最新中文字幕| 久久久久高潮综合影院| 香蕉久久夜色精品国产小说| 亚洲AV无一区二区三区久久 |