Общие управляемые ошибки C ++ - PullRequest
2 голосов
/ 10 июня 2011

На какие наиболее распространенные проблемы стоит обратить внимание при написании управляемого C ++ впервые после почти исключительно работы с неуправляемым C ++?

Ответы [ 4 ]

2 голосов
/ 10 июня 2011

Когда вы преобразуете управляемый делегат в указатель на функцию, используя встроенную технологию IJW (это просто работает), указатель на функцию не содержит ссылку на объект, из которого был делегат.Если вы не согласны хранить ссылку каким-либо другим способом, управляемый объект может быть собран, а затем при вызове функции вы получите исключение NullReferenceException.

Если вы многосоздаем C-библиотеку, которая принимает обратные вызовы, и вы хотите обернуть ее в управляемый класс.Клиент управляемого класса предоставит делегата, который вы преобразуете в обратный вызов.Также необходимо сохранить ссылку на делегат или целевой объект.

Это верно для Managed C ++ и C ++ / CLI.

1 голос
/ 24 августа 2011

Вот еще одна проблема: выполнение метода на объекте не представляет собой ссылку на объект.Это означает, что во время выполнения метода-члена объект, но после вашей последней ссылки на this, объект может быть очищен, пока метод еще выполняется, и финализатор может сработать.

Если ваш объект имеет какие-либо неуправляемыесостояние, которое очищено финализацией или содержит любой другой объект с таким неуправляемым состоянием, если вы выполняете вычисления в этом неуправляемом состоянии, обязательно вызовите GC::KeepAlive на this после этих неуправляемых вычислений.Теперь я склонен просто добавлять GC::KeepAlive ко всем методам объектов с неуправляемыми вычислениями.

1 голос
/ 14 июня 2011

Если вы имеете в виду C ++ / CLI ...

  • Забыть использовать pin_ptr при передаче аргументов по ссылке.В связи с этим важно понимать разницу между дескриптором отслеживания и указателем.См. Первые главы Expert C ++ / CLI .
  • C ++ / CLI не имеет конструкции C # yield, которую мы часто используем при написании модульных тестов с Nunit с использованием атрибута TestCaseSourceгенерировать данные тестового примера.Это связано со следующим.
  • Реализация System :: IEnumerable синтаксически громоздка.Но как только вы сделаете это один раз, у вас будет ссылка, так что это не так уж и плохо.
  • Очень важно понимать разницу между деструкторами и финализаторами.Для обсуждения этого, опять же, см. Главу 4 Expert C ++ / CLI
0 голосов
/ 11 июня 2014

Одна ошибка (которая только что получила меня): предполагая, что «деструктор может быть выполнен только один раз».Поскольку деструктор вызывается через Dispose, а Dispose может вызываться несколько раз, это предположение (что хорошо для C ++) не выполняется для C ++ / CLI.

...