代码之家  ›  专栏  ›  技术社区  ›  Lloyd Powell binku

在这种情况下,何时调用析构函数?(C)

  •  6
  • Lloyd Powell binku  · 技术社区  · 16 年前

    我想知道在这种情况下何时调用析构函数,如果是,那么它将在主UI线程上被调用吗?

    假设我有以下代码,何时调用析构函数,它会等到我完成所有函数调用之后再调用吗?

    private void Foo()
      {
      MyObject myObj = new MyObject();
      DoSomeFunThingsWithMyObject(myObj);
    
      myObj = new MyObject(); //is the destructor for the first instance called now?
      DoLongOminousFunctionality(myObj);  
      }
      //Or will it be called after the DoLongOminousFunctionality?
    

    如果线程在myobj=new myobject()中断,或者析构函数调用等待线程空闲,那么这只是我感兴趣的事情。

    谢谢你的信息。

    5 回复  |  直到 16 年前
        1
  •  17
  •   Bogdan_Ch    16 年前

    当垃圾收集器决定必须清理一些旧对象时,将调用析构函数。不能依赖.NET中的析构函数执行时间

    如果您不需要某些资源(尤其是在您有任何非托管资源(如TCP连接、SQL连接等)时,您应该使用Dispose(),而不是使用Dispose()。

    Implementing a Dispose Method

        2
  •  3
  •   DanDan    16 年前

    如果管理对象的生存期至关重要,请从IDisposible继承,然后可以使用 using keyword .

        3
  •  2
  •   Brian Rasmussen    16 年前

    在实例可用于垃圾收集之后,在某个时间点调用析构函数或终结器,因为它们也被命名。它不会像C++那样在一个确定的时间点发生。

        4
  •  2
  •   Matthew Scharley    16 年前

    析构函数(或终结器,有些人更喜欢称之为终结器)完全在单独的线程上运行。它们不在特定时间运行。它们不能保证在应用程序生命周期结束前运行,即使这样,它们也可能不会被调用。

        5
  •  1
  •   Daniel    16 年前

    一旦垃圾收集器可以确定不再使用对象,将调用析构函数(终结器)。终结器在终结器线程上运行, 同时地 到你的主程序!

    通过适当的优化(JIT编译器可以很容易地消除局部变量),这可能早于 里面 这个 第一 dosomeFunThingsWithMyObject调用(一旦该方法不再需要其参数),或在以后的任何时候调用。可能直到程序关闭后才调用它(在极少数情况下,终结器是 从未 叫)

    推荐文章