У меня есть собственный класс:
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)
вызывать справку между управляемыми функциями?