gcroot в c ++ / cli - PullRequest
       24

gcroot в c ++ / cli

12 голосов
/ 15 февраля 2011

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

Ответы [ 2 ]

18 голосов
/ 15 февраля 2011

gcroot - это шаблонный класс C ++ / cli, который облегчает хранение управляемых типов в классах C ++ / cli.

Вы можете, например, иметь следующее:

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.

10 голосов
/ 15 февраля 2011

Когда запускается сборщик мусора .NET, он определяет, какие объекты все еще используются, выполняя анализ достижимости.При поиске указателей на объекты анализируется только управляемая куча, поэтому, если у вас есть указатель от нативного объекта к управляемому объекту, необходимо сообщить сборщику мусора, чтобы он мог включить его в анализ достижимости и, таким образом,обновите указатель, если цель перемещается во время сжатия.

Как сказал rstevens, класс .NET GCHandle делает это, а C ++ / CLI - это ориентированная на C ++ оболочка для GCHandle, которая добавляет безопасность типов и удобнасинтаксис.

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