精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

.Net析構函數再論(源碼剖析)

開發 前端
一個對象需要進行空間的分配,當進行空間分配的時候,它會判斷當前函數是否包含了析構函數。如果包含了,則設置flags標志最后一位位1.然后在對象分配的時候,把它放入到析構隊列里面去。

1.前言

本篇繼續看下析構函數的一些引申知識。

2.概述

析構函數目前發現的總共有三個標記,這里分別一一介紹下。先上一段代碼:

internal class Program :  IDisposable{
     static void Main(string[] args){
         StreamReader? streamReader = null;
         streamReader = new StreamReader("Test_.dll");
         streamReader?.Dispose();
         Console.ReadLine();
     }
     ~Program(){
         Console.WriteLine("調用了析構函數");
     }
     public void Dispose(){
         this.Dispose();
         GC.SuppressFinalize(this);
     }
 }

這里的析構函數跟Dispose一起混用, ~Program()析構函數會通過Roslyn生成

.method family hidebysig virtual instance void 
        Finalize() cil managed
{
  .override [System.Runtime]System.Object::Finalize
  // 代碼大小       24 (0x18)
  .maxstack  1
  IL_0000:  nop
  .try
  {
    IL_0001:  nop
    IL_0002:  ldstr      bytearray (03 8C 28 75 86 4E 90 67 84 67 FD 51 70 65 )       // ..(u.N.g.g.Qpe
    IL_0007:  call       void [System.Console]System.Console::WriteLine(string)
    IL_000c:  nop
    IL_000d:  leave.s    IL_0017
  }  // end .try
  finally
{
    IL_000f:  ldarg.0
    IL_0010:  call       instance void [System.Runtime]System.Object::Finalize()
    IL_0015:  nop
    IL_0016:  endfinally
  }  // end handler
  IL_0017:  ret
} // end of method Program::Finalize

這里同時需要注意 streamReader?.Dispose();這句話,streamreader實際上繼承的是textreader

public class StreamReader : TextReader
{}

所以它調用Dispose的代碼是TextReader里面的Dispose:

public void Dispose()
 {
     Dispose(true);
     GC.SuppressFinalize(this);
 }

也就是關閉了streamReader流。然后base.Dispose.這個base.Dispose實際上就是它的父類TextReader里面的

public void Dispose()
{
   this._streamReader.close();
}

Dispose里面的下面一句代碼

GC.SuppressFinalize(this);

它是重點。

GC.SuppressFinalize

1.判斷當前類是否有析構函數

如果類里面有析構函數,比如例子里的Program,則會設置MethodTable的成員m_dwFlags

m_dwFlags |= enum_flag_HasFinalizer(0x00100000);

它的設置邏輯是如果存在析構函數,并且當前方法不是接口,不是虛方法,方法的索引小于當前類的索引數,當前的方法不是Object.Finlize()。那么說明當前這個類有析構函數,所以需要在當前類的MethodTable上進行操作,也即上面的m_dwFlags位設置。

邏輯代碼如下:

//存在析構函數,并且當前方法不是接口,不是虛方法
if (g_pObjectFinalizerMD && !IsInterface() && !IsValueClass())
{
    WORD slot = g_pObjectFinalizerMD->GetSlot();
    //方法的索引小于當前類宗的索引數,當前的方法不是Object.Finlize()
    if (slot < bmtVT->cVirtualSlots && (*bmtVT)[slot].Impl().GetMethodDesc() != g_pObjectFinalizerMD)
    {
        GetHalfBakedMethodTable()->SetHasFinalizer(); //這個地方就是設置m_dwFlags
        //此處省略一萬行
    }
}

2.調用GC.SuppressFinalize

設置當前類的對象頭

headerobj|BIT_SBLK_FINALIZER_RUN當我們調用GC.SuppressFinalize的時候,它會進行判斷m_dwFlags或上的enum_flag_HasFinalizer位是否為1,如果位0直接返回,如果為1,則設置對象頭。它的判斷邏輯如下

if (!obj->GetMethodTable ()->HasFinalizer())//HasFinalizer函數判斷m_dwFlags的enum_flag_HasFinalizer位
return;
GCHeapUtilities::GetGCHeap()->SetFinalizationRun(obj);//這里設置當前類的對象頭headerobj|BIT_SBLK_FINALIZER_RUN
BIT_SBLK_FINALIZER_RUN定義如下:
#define BIT_SBLK_FINALIZER_RUN   0x40000000

3.對象進行分配空間的時候

設置flags |= GC_ALLOC_FINALIZE一個對象需要進行空間的分配,當進行空間分配的時候,它會判斷當前函數是否包含了析構函數。如果包含了,則設置flags標志最后一位位1.然后在對象分配的時候,把它放入到析構隊列里面去。

if (pMT->HasFinalizer())//判斷當前類是否包含析構函數
    flags |= GC_ALLOC_FINALIZE;//如果包含則設置flags最后一位為1
GC_ALLOC_FINALIZE定義如下:
enum GC_ALLOC_FLAGS
{
    GC_ALLOC_NO_FLAGS           = 0,
    GC_ALLOC_FINALIZE           = 1,
    GC_ALLOC_CONTAINS_REF       = 2,
    GC_ALLOC_ALIGN8_BIAS        = 4,
    GC_ALLOC_ALIGN8             = 8,
    GC_ALLOC_ZEROING_OPTIONAL   = 16,
    GC_ALLOC_LARGE_OBJECT_HEAP  = 32,
    GC_ALLOC_PINNED_OBJECT_HEAP = 64,
    GC_ALLOC_USER_OLD_HEAP      = GC_ALLOC_LARGE_OBJECT_HEAP | GC_ALLOC_PINNED_OBJECT_HEAP,
};

當進行對象分配的時候,它會判斷falgs最后一位是否為1,如果為1,則把對象放入到析構隊列,不為1,則不放入。

CHECK_ALLOC_AND_POSSIBLY_REGISTER_FOR_FINALIZATION(newAlloc, size, flags & GC_ALLOC_FINALIZE); //flags & GC_ALLOC_FINALIZE判斷falgs最后一位是否為1.


#define CHECK_ALLOC_AND_POSSIBLY_REGISTER_FOR_FINALIZATION(_object, _size, _register) do {
    //這里的register就是flags & GC_ALLOC_FINALIZE的值,下面的邏輯如果對象為空直接返回,如果不為空則判斷flags & GC_ALLOC_FINALIZE是否等于1,如果為零直接返回,如果為1,則調用REGISTER_FOR_FINALIZATION,把對象放入析構隊列
    if ((_object) == NULL || ((_register) && !REGISTER_FOR_FINALIZATION(_object, _size))) 
    {
        STRESS_LOG_OOM_STACK(_size);
        return NULL;
    }

以上是析構函數,GC.SuppressFinalize,Dispose的最底層邏輯。當然這里還有很多技術問題需要解決。后面再看。

標記的作用

GC.SuppressFinalize問題來了,它的這些標記有什么用呢?這是一個非常繞的問題,分析下。首先的enum_flag_HasFinalizer標記表示當前類包含了析構函數,GC_ALLOC_FINALIZE標記表示當前的類對象需要填充到析構隊列里面去。

而BIT_SBLK_FINALIZER_RUN標記是最為重要的,它如果被標記了則表示從析構隊列里面溢出,不需要運行這個當前類的析構函數。

在GC的標記階段標記對象是否存活完成之后,它需要對對象的析構隊列進行掃描。如果析構隊列(SegQueue)里的對象被標記存活,且它的對象頭有

BIT_SBLK_FINALIZER_RUN標志,則表示此對象的析構隊列里的對象可以移出了,也就是不運行此對象的析構函數。

//這里的ScanForFinalization是在GCScanRoot之運行的,還有一個從析構函數里面取出
//對象運行析構函數則是GCHeap::GetNextFinalizableObject
CFinalize::ScanForFinalization (promote_func* pfn, int gen, BOOL mark_only_p,
                                gc_heap* hp)
{   
  //判斷對象頭是否標記了BIT_SBLK_FINALIZER_RUN
  if ((obj->GetHeader()->GetBits()) & BIT_SBLK_FINALIZER_RUN)
                    {
                        //如果標記了,則把這個對象移除到FreeList,也即是空閑的析構列表,不然存在于析構列表中
                        MoveItem (i, Seg, FreeList);
                        //然后清除掉此對象頭BIT_SBLK_FINALIZER_RUN標志
                        obj->GetHeader()->ClrBit (BIT_SBLK_FINALIZER_RUN);
                    }
}
再論CLR析構函數.net 6 析構函數的幾個特性CLR析構列表是如何添加析構函數類的
責任編輯:武曉燕 來源: 江湖評談
相關推薦

2023-10-11 14:18:40

C#.Net析構

2021-12-11 19:02:03

函數C++對象

2009-08-14 17:24:28

C#構造函數和析構函數

2025-02-18 00:08:00

代碼C++RAII

2010-07-20 09:52:27

Perl構造函數

2009-09-03 13:14:55

C#構造函數C#析構函數

2009-12-04 17:16:41

PHP析構函數

2010-07-16 17:12:58

Perl析構函數

2010-02-04 16:39:26

C++析構函數

2010-01-18 15:53:27

C++析構函數

2011-07-15 01:29:39

C++析構函數

2009-07-30 15:24:13

C#析構函數C#構造函數

2010-02-05 13:35:19

C++虛析構函數

2024-12-19 14:42:15

C++內存泄漏內存管理

2009-11-24 16:18:14

PHP5析構函數

2009-09-02 10:49:46

C#調用析構方法

2009-10-15 17:50:48

VB.NET調用API

2015-12-15 09:58:19

golang環境配置建議

2010-09-07 13:40:02

DIV標簽

2010-03-29 09:11:02

Python引用計數
點贊
收藏

51CTO技術棧公眾號

欧美激情精品久久| 妞干网视频在线观看| 波多野结衣网站| 国产精品久久占久久| 欧美变态tickling挠脚心| 国产 日韩 亚洲 欧美| 国产精品一区二区三区四区色| 日本强好片久久久久久aaa| 久久香蕉国产线看观看网| 精品无码人妻少妇久久久久久| 成人线上视频| 亚洲精品乱码久久久久久黑人| 精品免费二区三区三区高中清不卡 | 激情五月婷婷网| 久久精品影视| 亚洲欧美日韩国产成人| 香蕉视频xxxx| 日韩欧美看国产| 一个色综合av| 亚洲国产一区在线| 午夜在线观看视频18| 久久精品久久精品| 清纯唯美亚洲综合| 久久久久久久久久网站| 欧美综合另类| 亚洲国产天堂久久国产91 | 亚州国产精品视频| 婷婷成人基地| 在线视频欧美日韩精品| 亚洲av成人片色在线观看高潮| 日韩免费在线电影| 欧美色另类天堂2015| 日韩 欧美 视频| 黄视频网站在线看| 欧美激情一区二区在线| 精品无码久久久久国产| 国产高中女学生第一次| 久久99精品久久只有精品| 欧洲午夜精品久久久| 精品在线视频免费观看| 亚洲一区 二区 三区| 中文字幕日韩综合av| xxx在线播放| 综合伊思人在钱三区| 精品国产成人系列| 在线播放av网址| 国产精品欧美一区二区三区不卡| 欧美三区在线观看| 一区二区成人网| 日本综合字幕| 色噜噜狠狠色综合欧洲selulu | 日韩精品免费视频人成| 国产视频一区二| 国产精品不卡在线观看| 日本精品一区二区| 精品视频一二区| 91麻豆国产精品久久| 精品国产综合| 欧洲免费在线视频| 久久久天堂av| 日韩欧美视频一区二区三区四区| 国产资源在线播放| 国产日韩精品一区二区三区| 欧美lavv| 国产精品四虎| 国产精品久久久久久久久果冻传媒| 日韩一区二区电影在线观看| www.亚洲.com| 国产精品电影院| 看全色黄大色大片| 欧美aaa免费| 亚洲午夜一二三区视频| 国产日韩亚洲欧美在线| 激情国产在线| 色菇凉天天综合网| 粉色视频免费看| a一区二区三区亚洲| 日韩免费视频线观看| 91黄色免费视频| 欧美色就是色| 欧美成人激情在线| 国产成人精品a视频一区| 欧美中文日韩| 国产一区二区在线播放| 亚洲AV无码乱码国产精品牛牛| zzijzzij亚洲日本少妇熟睡| 欧美日韩精品免费观看视一区二区| 国产小视频在线| 中日韩av电影| 欧美中日韩在线| 女生影院久久| 91精选在线观看| 自拍视频一区二区| 成人a'v在线播放| 欧美成人精品在线视频| 国产尤物在线视频| 久草在线在线精品观看| 国产在线一区二区三区欧美| 91在线不卡| 亚洲一区二区三区中文字幕在线| 超碰网在线观看| 欧美美女一级片| 啊v视频在线| 亚洲综合一二区| 毛片av免费在线观看| 精品精品视频| 亚洲欧洲中文天堂| 久草免费新视频| 日本vs亚洲vs韩国一区三区二区| av蓝导航精品导航| 国产午夜视频在线观看| 亚洲国产一区二区在线播放| 爱情岛论坛vip永久入口| 6080成人| 日韩在线欧美在线| 日本一区二区三区四区五区| 精品一区二区国语对白| 欧美成人第一区| 男人天堂亚洲| 欧美一区三区二区| 日本理论中文字幕| 亚洲欧美成人| 国产精品一区二区不卡视频| 欧美激情办公室videoshd| 色哟哟在线观看一区二区三区| 久久久无码人妻精品无码| 97国产成人高清在线观看| 日本精品性网站在线观看| 成人小说亚洲一区二区三区| 亚洲欧洲性图库| 青青青在线视频免费观看| 欧美调教网站| 韩国美女主播一区| www.com欧美| 亚洲日本乱码在线观看| 日本不卡一区在线| 精品久久久久久久久久久aⅴ| 欧美一区第一页| 亚洲欧美丝袜中文综合| 午夜影视日本亚洲欧洲精品| 成人免费看片载| 中文字幕免费一区二区三区| 国产日韩综合一区二区性色av| 成年人在线视频| 欧美在线免费观看亚洲| 亚洲av熟女国产一区二区性色| 六月婷婷一区| 欧洲精品久久| 色天使综合视频| 自拍视频国产精品| 中文字幕网址在线| 国产精品萝li| 亚洲欧美手机在线| 午夜日韩av| 高清av免费一区中文字幕| 免费在线中文字幕| 亚洲国产美女精品久久久久∴| 国产精彩视频在线观看| 99国产精品久久久久久久久久 | 精品人妻少妇嫩草av无码| 国产一区激情| 国产亚洲精品自在久久| 蜜桃av在线播放| 亚洲欧美一区二区三区久久| www.色国产| 国产精品久久综合| 国产人妻精品久久久久野外| 国产精品大片免费观看| 久久精品国产精品国产精品污 | 最新av网站在线观看| 欧美日韩一本到| 波多野结衣不卡视频| 国产91丝袜在线观看| 精品视频免费在线播放| 色综合中文网| 91香蕉亚洲精品| 大黄网站在线观看| 日韩精品视频在线观看免费| www.亚洲激情| 一区二区三区不卡视频| 亚洲av成人片色在线观看高潮| 日韩电影在线观看电影| 欧美与动交zoz0z| 欧美变态挠脚心| 国产精品美女在线观看| 污污在线观看| 亚洲欧美激情一区| 国产麻豆免费观看| 亚洲va欧美va国产va天堂影院| 色一情一交一乱一区二区三区| 国产综合一区二区| 国产日韩av网站| 色777狠狠狠综合伊人| 国产成人女人毛片视频在线| 日韩中文影院| 欧美激情xxxx性bbbb| 好男人免费精品视频| 欧美一区二区在线观看| 日产精品久久久| 日韩毛片在线免费观看| 久久无码人妻精品一区二区三区 | 欧美xxxx日本和非洲| 久久一区激情| 五月天激情小说综合| 久久久噜噜噜www成人网| 久久综合国产| 欧美不卡1区2区3区| 亚洲3区在线| 国产精品人成电影| 美女的胸无遮挡在线观看| 久久精品91久久香蕉加勒比 | av在线播放一区二区三区| 激情 小说 亚洲 图片: 伦| 在线播放一区| 日本丰满大乳奶| 不卡av一区二区| 久久er99热精品一区二区三区| 欧美成人精品一级| 国产精品伦子伦免费视频| 蜜桃av在线| 久久久久久有精品国产| 日韩精品黄色| 亚洲天堂开心观看| 亚州男人的天堂| 欧美www视频| 国产熟女一区二区三区五月婷 | 欧美黄色片免费观看| 欧美三级黄网| 中文字幕精品一区二区精品| 水中色av综合| 日韩av网站大全| 丁香六月色婷婷| 精品女同一区二区| 国产成a人亚洲精v品无码 | 久久人人爽av| 日韩国产欧美三级| 少妇高清精品毛片在线视频| 亚洲国产精品第一区二区| 日本黄色片一级片| 欧美喷水视频| 成年在线观看视频| 午夜国产欧美理论在线播放 | 激情欧美一区| 成人免费a级片| 欧美日韩国产亚洲一区| 日韩精品手机在线观看| 久久久精品久久久久久96| 影音先锋欧美在线| 天天av综合| 国产四区在线观看| 欧美国产专区| 国产精彩视频一区二区| 日韩视频二区| 国产亚洲天堂网| 玖玖在线精品| 日本中文字幕高清| 精品在线播放免费| 久久黄色一级视频| av电影一区二区| 国产精品第七页| 国产情人综合久久777777| 91资源在线播放| 日韩美女精品在线| 久久精品视频国产| 欧美午夜片欧美片在线观看| 国产又粗又猛又黄视频| 欧美日韩一区久久| 国产人妖在线播放| 精品久久一二三区| 日韩av成人| 在线日韩第一页| caopon在线免费视频| 国产69精品久久久| 亚洲黄色免费看| 国产精品免费电影| 日韩精品三级| 欧美日韩电影一区二区三区| 成人精品视频| 日本免费a视频| 日韩中文字幕亚洲一区二区va在线| 99热一区二区| av在线播放一区二区三区| 亚洲精品成人av久久| 夜夜嗨av一区二区三区四季av| 国产小视频在线免费观看| 欧美色窝79yyyycom| 性生活黄色大片| 亚洲天堂色网站| 在线黄色网页| 国产91热爆ts人妖在线| 久久国产精品美女| 欧美性xxxx69| 国产精品啊啊啊| 91香蕉视频导航| 成人av网站在线| 成人一级片免费看| 午夜精品福利视频网站| 中文字幕欧美人妻精品| 亚洲国产精彩中文乱码av| eeuss影院www在线播放| 欧美激情亚洲另类| 欧美v亚洲v综合v国产v仙踪林| 国产精品欧美久久| 91久久高清国语自产拍| 北条麻妃在线观看| 国产不卡视频在线播放| 亚洲一级黄色录像| 好吊成人免视频| 超碰在线人人干| 中文字幕国产精品| 天堂√8在线中文| av在线亚洲男人的天堂| 天天做综合网| 成年网站在线播放| 国产色一区二区| 国产成人愉拍精品久久| 日韩午夜激情视频| 午夜视频在线看| 国产精品pans私拍| 日韩一级电影| 国产一区二区四区| 国产麻豆午夜三级精品| www成人啪啪18软件| 欧美性xxxx极品hd欧美风情| 亚洲精品一区二区口爆| 日韩精品成人一区二区在线| www.-级毛片线天内射视视| 日本欧美在线观看| 黄瓜视频污在线观看| 亚洲成a人v欧美综合天堂| 精品国产99久久久久久宅男i| 在线视频日韩精品| yy6080久久伦理一区二区| 欧美日韩国产三区| 久热综合在线亚洲精品| 国产免费看av| 欧美视频在线免费看| 色婷婷av一区二区三| 久久久久久国产| 成人自拍在线| 亚洲精品无码国产| 成人免费毛片高清视频| 精品在线免费观看视频| 精品成人在线观看| 678在线观看视频| 国产欧美日韩伦理| 亚洲日产国产精品| 国产人妻人伦精品1国产丝袜| 亚洲成av人片在线| 亚洲三级中文字幕| 欧亚精品中文字幕| 欧美日韩在线二区| 亚洲免费黄色网| 亚洲色图欧洲色图| 性一交一乱一伧老太| 久久人人爽人人| 免费成人蒂法| 青青在线免费观看视频| 欧美国产日韩在线观看| 一本色道久久综合亚洲| 美女性感视频久久久| 波多野结衣欧美| 日韩欧美视频网站| 国产婷婷色一区二区三区四区| 国产裸体美女永久免费无遮挡| 日韩在线免费观看视频| 九九99久久精品在免费线bt| 东北少妇不带套对白| 久久先锋影音av| 国产一区二区三区中文字幕| 欧美www在线| 日韩三级毛片| 天堂在线资源视频| 亚洲免费三区一区二区| 天天操天天操天天操| 国产精品爱啪在线线免费观看| 久久久久av| 狠狠人妻久久久久久综合蜜桃| 欧美三级视频在线播放| 青青草原av在线| 免费看成人午夜电影| 久久69国产一区二区蜜臀| 国产亚洲精品久久777777| 亚洲欧洲一区二区三区久久| 日韩一区二区三区四区五区| 六月婷婷在线视频| 亚洲国产岛国毛片在线| 亚洲黄色小说网| 国产高清视频一区三区| 欧美不卡一区| 国产伦理片在线观看| 日韩欧美123| 欧美精品高清| 欧美一级欧美一级| 国产精品久久久久永久免费观看| 亚洲成a人片在线| 国产精品美女免费视频| 99riav1国产精品视频| 亚洲二区在线播放| 亚洲天天在线日亚洲洲精|