Когда выражение ==
используется для выражения типа object
, оно будет разрешено System.Object.ReferenceEquals
.
Equals
является всего лишь методом virtual
и ведет себя как таковой, поэтому будет использоваться переопределенная версия (которая для типа string
сравнивает содержимое).
Не должно возникнуть проблем с использованием boost :: shared_ptr
, если вы правильно инициализируете общие указатели и используете один и тот же контекст управления памятью для всех ваших библиотек общих объектов.
В вашем случае вы пытаетесь использовать неинициализированный общий указатель.
boost::shared_ptr<Obj> obj;
obj->Something(); // assertion failed
boost::shared_ptr<Obj> obj(new Obj);
obj->Something(); // ok
Я бы посоветовал по возможности инициализировать их прямо при объявлении. Обработка исключений может создать множество «невидимых» путей для запуска кода, и может быть довольно сложно идентифицировать неинициализированные общие указатели.
PS: Есть и другие проблемы, если вы загружаете / выгружаете модули, в которых используется shared_ptr
, что приводит к хаосу. Это очень сложно решить, но в этом случае у вас будет ненулевой указатель. Это не то, что сейчас происходит с вами.