Сборка мусора в C ++ / CLI - PullRequest
2 голосов
/ 06 мая 2009

Рассмотрим ниже:

#include <iostream>

public ref class TestClass {
public:
    TestClass() { std::cerr << "TestClass()\n"; }
    ~TestClass() { std::cerr << "~TestClass()\n"; }
};

public ref class TestContainer {
public:
    TestContainer() : m_handle(gcnew TestClass) { }

private:
    TestClass^ m_handle;
};

void createContainer() {
    TestContainer^ tc = gcnew TestContainer();
        // object leaves scope and should be marked for GC(?)
}


int main() {
    createContainer();

    // Manually collect.
    System::GC::Collect();
    System::GC::WaitForPendingFinalizers();

    // ... do other stuff

    return 0;
}

Мой вывод просто: TestClass ()

Я никогда не получаю ~ TestClass (). Это упрощение проблемы, с которой я столкнулся в производственном коде, когда список дескрипторов очищается и заполняется несколько раз, а деструкторы дескрипторов никогда не вызываются.

Что я делаю не так?

С уважением, Ryan

1 Ответ

5 голосов
/ 06 мая 2009
~TestClass()

объявляет функцию удаления.

!TestClass()

объявляет финализатор (эквивалент ~TestClass) в C #, который вызывается для коллекции gc (хотя это не гарантируется).

...