2010-08-25 100 views
2

CustomPropertyList类是在我的窗体构造函数中创建的。为什么我的析构函数从来没有调用过?

form(String ^s) 
{ 
    InitializeComponent(); 
    CustomPropertyList ^propertyList = gcnew CustomPropertyList(s); 
... 

的CustomPropertyList类有析构函数

CustomPropertyList::~CustomPropertyList() 
{ 

    if (MessageBox::Show("Do you want to save your changes?","Editin",MessageBoxButtons::YesNo)==DialogResult::Yes) 
... 

为什么不叫程序退出时? (我知道这是不是因为我没有看到该消息框,并有一个断点)

我任何帮助

回答

8

非常感激因为这不是析构函数,这是Dispose方法(在C#中的术语)。如果客户端不调用Dispose,则永远不会调用它。另一方面,应该调用finalizer(!CustomPropertyList),除非使用GC :: SuppressFinalize来防止它。

从C#代码中,可以使用Dispose调用〜CustomPropertyList。从C++/CLI客户端代码中,可以使用delete操作符调用它。

看到这个C++/CLI大师文章的详细信息:http://www.codeproject.com/KB/mcpp/cppclidtors.aspx

+0

感谢 - 它的工作非常好 - 刚添加删除 – wezten 2010-08-25 12:49:17

2

从.net,一个C++/CLI类看起来像一个实现IDisposable接口的类。要调用析构函数,您必须在对象上调用Dispose

1

在C++/CLI中,如果希望对象具有由封闭作用域(对于成员子对象,与父对象具有相同的生命周期)控制的生存期,请在不使用句柄或指针语法的情况下声明它们。

例如

CustomPropertyList propertyList(s); 

或成员子对象:

ref class form 
{ 
    CustomPropertyList propertyList; 
    form(String^ s) 
     : propertyList(s) 
    { 
     InitializeComponent(); 
    } 
} 
相关问题