2010-08-25 2 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, он никогда не вызывается. С другой стороны, необходимо вызывать финализатор (! CustomPropertyList), если только GC :: SuppressFinalize не используется.

Из кода C# ~ CustomPropertyList можно вызвать с помощью утилизации. Из кода клиента C++/CLI его можно вызвать с помощью оператора delete.

Смотреть подробнее в этом C++/CLI гуру статьи: http://www.codeproject.com/KB/mcpp/cppclidtors.aspx

+0

Спасибо - она ​​работала очень хорошо - просто добавил удалить – wezten

2

С .net, класс C++/CLI выглядит как класс, который реализует интерфейс IDisposable. Чтобы вызвать деструктор, вам нужно позвонить Dispose об объекте.

1

В C++/CLI, если вы хотите, чтобы объекты имели время жизни, контролируемое оболочкой (для субобъектов-членов, такое же время жизни, что и родительское), объявляйте их без синтаксиса дескриптора или указателя.

например.

CustomPropertyList propertyList(s); 

или подобъекту члена:

ref class form 
{ 
    CustomPropertyList propertyList; 
    form(String^ s) 
     : propertyList(s) 
    { 
     InitializeComponent(); 
    } 
} 
Смежные вопросы