为什么我的析构函数从未被调用过?

时间:2010-08-25 12:42:51

标签: .net c++-cli

我的表单构造函数中创建了一个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)
...

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

我非常感谢任何帮助

3 个答案:

答案 0 :(得分:8)

因为这不是析构函数,所以这是Dispose方法(用C#术语)。如果客户端不调用Dispose,则永远不会调用它。另一方面,应该调用终结器(!CustomPropertyList),除非使用GC :: SuppressFinalize来阻止它。

从C#代码,可以使用Dispose调用~CustomPropertyList。从C ++ / CLI客户端代码,可以使用delete operator来调用它。

请参阅此C ++ / CLI大师文章中的更多详细信息:http://www.codeproject.com/KB/mcpp/cppclidtors.aspx

答案 1 :(得分:2)

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

答案 2 :(得分:1)

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

e.g。

CustomPropertyList propertyList(s);

或成员子对象:

ref class form
{
    CustomPropertyList propertyList;
    form(String^ s)
      : propertyList(s)
    {
       InitializeComponent();
    }
}