Почему мой деструктор никогда не вызывается? - PullRequest
2 голосов
/ 25 августа 2010

В моем конструкторе формы создан класс 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 ]

8 голосов
/ 25 августа 2010

Поскольку это не деструктор, это метод Dispose (в терминах C #).Если клиент не вызывает Dispose, он никогда не вызывается.С другой стороны, финализатор (! CustomPropertyList) должен вызываться, если только GC :: SuppressFinalize не используется для его предотвращения.

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

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

2 голосов
/ 25 августа 2010

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

1 голос
/ 26 августа 2010

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

, например

CustomPropertyList propertyList(s);

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

ref class form
{
    CustomPropertyList propertyList;
    form(String^ s)
      : propertyList(s)
    {
       InitializeComponent();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...