Что означает gcroot? Я нашел его в коде, который я читаю.
Gcroot в С++/cli
Ответ 1
gcroot - это шаблонный класс C++/cli, который облегчает хранение управляемых типов в классах C++/cli.
Вы можете, например, иметь следующее:
#include <msclr/gcroot.h>
using namespace msclr;
class Native {
public:
Native(Object ^obj) :
netstring(obj->ToString()) { // Initializing the gcroot<String ^>
}
~Native() {
}
void Print() {
array<Char> ^chars = netstring->GetChars(); // Dereferencing the gcroot<String ^>
_wprintf("netstring is:");
if (chars->Length > 0) {
pin_ptr<Char> charptr = &(chars[0]);
_wprintf("%s", (wchar_t const *)charptr);
}
}
private:
gcroot<String ^> netstring;
};
gcroot действует как ссылка на экземпляр управляемого объекта или типа значения и выполняет всю работу при копировании экземпляра объекта или типа значения. Обычно вам нужно работать с GCHandle и некоторыми функциями C.NET Framework. Это все заключено в gcroot.
Ответ 2
Когда сборщик мусора .NET работает, он определяет, какие объекты все еще используются, делая анализ доступности. Только анализируемая куча анализируется при поиске указателей на объекты, поэтому, если у вас есть указатель от собственного объекта к управляемому объекту, вам нужно сообщить коллекционеру мусора, чтобы он мог включать его в анализ достижимости, и поэтому он может обновите указатель, если цель перемещается во время уплотнения.
Как сказал rstevens, класс .NET GCHandle
делает это, а С++/CLI - это С++-ориентированная оболочка для GCHandle
, которая добавляет безопасность типа и удобный синтаксис.