Gcroot в С++/cli

Что означает gcroot? Я нашел его в коде, который я читаю.

Ответ 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, которая добавляет безопасность типа и удобный синтаксис.