gcroot не имеет значения - PullRequest
0 голосов
/ 28 июня 2011

У меня возникла любопытная проблема с управляемым объектом в неуправляемом коде.У меня есть этот модуль C ++ / CLI, который соединяет код C ++ и C #.У меня есть такая структура:

template <class T>
struct ManagedReference
{
  gcroot<T^> addonHost;
}

Теперь, в какой-то момент я создаю экземпляр этой управляемой ссылки и устанавливаю addonHost.Все хорошо, я могу использовать ручку.

enter image description here

Однако, в некоторых случаях (боюсь, потребуется много контекстного описания), значение не может быть оценено:

enter image description here

В этом случае вызов метода с addonHost приводит к исключению «Точка входа для найденного».

Как видно из скриншотов, этоэто не две разницы, две разные ручки.Это то же самое.Я не понимаю, как в какой-то ситуации «ценность» не оценивается.И, может быть, как я мог поймать это.Потому что это не нуль.

Я должен также упомянуть, что у меня есть несколько gcroot<T>, и у всех есть эта проблема, кроме одной, которая gcroot<System::String>.

ОБНОВЛЕНИЕ

Вот что показывает отладчик во время выполнения.Объект создан и доступен, затем в какой-то момент значение «исчезает», и при следующем вызове оно все еще там.Но это очень воспроизводимо.Это не случайно.

handle  0x0E1618EC  void*
 value  0x106396d8 { m_host=0x10638e04 }    <-- object is available here

handle  0x0E1618EC  void*
 value  0x1020e558 { m_host=0x1020e4f0 }    <-- object moved in memory

handle  0x0E1618EC  void*
 value                                      <-- no value here

handle  0x0E1618EC  void*
 value  0x1020e558 { m_host=0x1020e4f0 }    <-- object 'is back'

1 Ответ

0 голосов
/ 28 июня 2011

Может быть, это поможет инициализировать gcroot.Попробуйте:

template <class T>
struct ManagedReference
{
  gcroot<T^> addonHost;
  ManagedReference() : addonHost(nullptr) {}
};
...