Как написать контрольный пример, который мусор собирает в середине выполнения функции? - PullRequest
0 голосов
/ 27 сентября 2019

У меня есть собственный класс:

class NativeClass
{
int someVariable;
public:
void someNativeFunction(){}
};

У меня есть управляемый класс, который слегка оборачивает этот собственный класс.

class ManagedClass
{
NativeClass *nativeClassObject;
public:
void someManagedFunction()
{
    nativeClassObject->someNativeFunction();
}
};

Я использую этот управляемый класс в своем приложении C #:

static void Main(string[] args)
{
ManagedClass objManagedClass = new ManagedClass();
objManagedClass.someManagedFunction();//line_1
//At this point onwards objManagedClass still has a reference on the stack, but is not used again.
//So, GC can delete this object.
}

Поскольку на objManagedClass нет ссылки после line_1, сборщик мусора может уничтожить объект, даже если он обрабатывает внутренний собственный вызов.Это приведет к уничтожению objManagedClass, что в свою очередь уничтожит *nativeClassObject.Это может произойти, только если someNativeFunction выделяет много памяти или занимает много времени, но просто чтобы быть уверенным, я должен добавить ссылку на objManagedClass позже после вызова.

class ManagedClass
{
NativeClass *nativeClassObject;
public:
void someManagedFunction()
{
    nativeClassObject->someNativeFunction();
...
...
System::GC::KeepAlive(this);
}
};

KeepAlive() вызов должен предотвратить уничтожение GC.Есть ли способ проверить этот сценарий?Какой-нибудь тестовый пример, который я мог бы написать, потерпел бы неудачу, если бы я не предоставил KeepAlive(), но прошел бы, как только я его назвал?Будет ли Thread.Sleep(5000) вызывать справку между управляемыми функциями?

1 Ответ

1 голос
/ 27 сентября 2019

Вы можете принудительно запустить сборку мусора, вызвав GC::Collect, а затем дождаться окончания сборки мусора, используя GC::WaitForPendingFinalizers.Это должно позволить вам протестировать ваши сценарии.

Взгляните на пример на MSDN

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...