проверить существующий shared_ptr при использовании enable_shared_from_this в С++?

Помимо перехвата ошибки bad_weak_ptr, возникающей при попытке вызвать shared_from_this() для указателя, который является необработанным указателем, есть ли способ проверить, ведется ли подсчет ссылок на объект?

У меня есть функции, которые работают с необработанным указателем и общим указателем, и я хочу быть уверенным, что ошибка очевидна при использовании неправильного? Я могу, конечно, просто поймать ошибку, но мне просто интересно, есть ли простой способ тестирования для этого конкретного случая?


person Dan    schedule 03.11.2010    source источник
comment
Звучит как плохой дизайн для меня. Возможно, рассмотрите возможность публикации вашего кода.   -  person GManNickG    schedule 04.11.2010
comment
%union в yacc/bison разрешает только типы POD, поэтому мне приходится использовать указатели (в этом qs говорится об этом: stackoverflow.com/questions/64958/ ), однако я хочу использовать интеллектуальные указатели для «модели», сформированной из ast, поэтому мне нужно их смешать.   -  person Dan    schedule 04.11.2010


Ответы (2)


Вызов std::enable_shared_from_this<T>::shared_from_this() никогда не завершится ошибкой для существующего действительного объекта или указателя на него. РЕДАКТИРОВАТЬ: ... если есть хотя бы один экземпляр std::shared_ptr<YourClass>, где YourClass равно std::enable_shared_from_this<YourClass>. Это более строгое утверждение, чем первое, и я прошу прощения, если оно было неправильно понято.

Вы обеспечиваете достоверность shared_from_this(), создавая только shared_ptr экземпляров ваших классов. Невозможно проверить, управляется ли экземпляр YourClass экземпляром shared_ptr, кроме перехвата исключения.

person Paul Michalik    schedule 03.11.2010

Не смешивайте необработанные указатели и управляемые указатели.

person Cheers and hth. - Alf    schedule 03.11.2010
comment
У меня нет выбора, см. комментарий выше. - person Dan; 04.11.2010