垃圾回收中的一点小知识

    都知道C#中垃圾是自动回收的,但是还是有需要注意的地方。垃圾回收有三个步骤:首先检查托管代码中引用的托管对象,然后尝试析构没有被析构的对象,最后垃圾回收器释放对象并回收内存。这其中有风险,那就是如果对象被非托管代码引用时(比如Win32 API、非托管DLL,或者使用COM的方法等),该对象有可能被错误的回收,这会导致程序运行错误。还有就是,垃圾回收这些事情都是系统单独线程来进行的,这样的话,如果一个对象在一个方法中产生,那么该对象在运行期间就有可能被回收。
   上面两种问题都可以用KeepAlive()来解决,例如:
private static void SafeDoWork() 
    {
        Example ex = new Example();
        /…………
         ………………
        ………………/
        GC.KeepAlive(ex);
    }


这个方法是告诉系统,ex这个对象不管怎么样也要给我保持到我调用KeepAlive()的地方。要不,这个方法退出后,系统会把ex回收掉,但是ex可能还正处于运行阶段。

你可能感兴趣的:(C++,c,C#)