Rumah >pembangunan bahagian belakang >C++ >Kenapa pemungut sampah NET saya memuktamadkan objek awal semasa debug?
Debugging dan pengumpul sampah .NET: Penyempurnaan awal yang tidak dijangka
Pengumpul sampah .NET (GC) biasanya memuktamadkan objek apabila mereka tidak lagi dirujuk. Walau bagaimanapun, penyahpepijatan boleh memperkenalkan akhir awal yang tidak dijangka. Mari kita periksa tingkah laku ini:Pertimbangkan coretan kod ini:
<code class="language-csharp">public class Class1 { public static int c; ~Class1() { c++; } } public class Class2 { public static void Main() { { var c1 = new Class1(); } GC.Collect(); GC.WaitForPendingFinalizers(); Console.WriteLine(Class1.c); // Might print 0 or 1 } }</code>kami menjangkakan
untuk mencetak 0. objek Class1.c
harus dimuktamadkan selepas meninggalkan skopnya. Namun, semasa penyahpepijatan, kadang -kadang mencetak 1, menunjukkan pemakaian pramatang c1
sebelum . GC.Collect()
Pengaruh debugger
anomali ini berpunca dari interaksi antara debugger dan pengkompil yang tepat (JIT). Pengkompil JIT biasanya mengoptimumkan kod dalam pelepasan membina, mengesan secara tepat objek hidup objek. Walau bagaimanapun, debuggers sering melumpuhkan pengoptimuman ini untuk keupayaan debugging yang lebih baik. Ini memberi kesan kepada bagaimana GC mengendalikan pemasien objek:
c1
c1
Untuk membetulkannya, laksanakan kod dalam mod pelepasan. Sebagai alternatif, laraskan tetapan debugger untuk membolehkan pengoptimuman JIT. Ini memastikan tingkah laku GC yang tepat.
mata tambahan
tetapan
c1
null
GC.KeepAlive()
Penyempurnaan awal, yang disebabkan oleh debugging, boleh merumitkan senario yang melibatkan rujukan luaran atau interop. Atas ialah kandungan terperinci Kenapa pemungut sampah NET saya memuktamadkan objek awal semasa debug?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!