Ответ 1
Это абсолютно безопасно.
Следующий пример кода:
#include <iostream>
#include <boost/shared_ptr.hpp>
int main(int, char**)
{
boost::shared_ptr<int> a(new int(5));
boost::shared_ptr<const int> b = a;
std::cout << "a: " << a.use_count() << std::endl;
std::cout << "b: " << b.use_count() << std::endl;
return EXIT_SUCCESS;
}
Компилирует и работает нормально, и это совершенно правильно. Он выводит:
a: 2
b: 2
Два shared_ptr
используют один и тот же счетчик ссылок.
также:
#include <iostream>
#include <boost/shared_ptr.hpp>
class A {};
class B : public A {};
int main(int, char**)
{
boost::shared_ptr<A> a(new B());
boost::shared_ptr<B> b = boost::static_pointer_cast<B>(a);
std::cout << "a: " << a.use_count() << std::endl;
std::cout << "b: " << b.use_count() << std::endl;
return EXIT_SUCCESS;
}
Ведите себя так же. Вы должны, тем не менее, никогда строить shared_ptr
с помощью такой конструкции:
boost::shared_ptr<A> a(new B());
boost::shared_ptr<B> b(static_cast<B*>(a.get()));
a.get()
дает исходный указатель и теряет всю информацию о подсчете ссылок. В результате вы получите два разных (не связанных) shared_ptr
, которые используют один и тот же указатель, но разные счетчики ссылок.