読んで「C++標準ライブラリを超えては:はじめにブーストする」、私は非常に興味深い例だ:boost ::〜shared_ptrはどのように動作しますか?
class A
{
public:
virtual void sing()=0;
protected:
virtual ~A() {};
};
class B : public A
{
public:
virtual void sing()
{
std::cout << "Do re mi fa so la"<<std::endl;;
}
};
をし、私はいくつかのテストを実行します。私はここに非常に好奇心何
int main()
{
//1
std::auto_ptr<A> a(new B); //will not compile ,error: ‘virtual A::~A()’ is protected
//2
A *pa = new B;
delete pa; //will not compile ,error: ‘virtual A::~A()’ is protected
delete (dynamic_cast<B*>(pa)); //ok
//3
boost::shared_ptr<A> a(new B);//ok
}
shared_ptrはどのように動作しますか? 派生クラスBを推論する方法は?
ありがとうございました!
- テンプレート構造機能
- リソースが〜shared_ptrのでは削除されていない、それを:
おかげで、すべて、 私は鍵がある
class sp_counted_base { public: virtual ~sp_counted_base(){} }; template<typename T> class sp_counted_base_impl : public sp_counted_base { public: sp_counted_base_impl(T *t):t_(t){} ~sp_counted_base_impl(){delete t_;} private: T *t_; }; class shared_count { public: static int count_; template<typename T> shared_count(T *t): t_(new sp_counted_base_impl<T>(t)) { count_ ++; } void release() { --count_; if(0 == count_) delete t_; } ~shared_count() { release(); } private: sp_counted_base *t_; }; int shared_count::count_(0); template<typename T> class myautoptr { public: template<typename Y> myautoptr(Y* y):sc_(y),t_(y){} ~myautoptr(){ sc_.release();} private: shared_count sc_; T *t_; }; int main() { myautoptr<A> a(new B); }
をどのように動作するか〜shared_ptrのについての簡単なサンプルを作成しますshared_countによって削除されました
技術的に言えば、B *からA *への変換を実行します。その後のポインターへのすべてのアクセスは、タイプA *を使用します。タイプBの操作は、標準的な多態性を介して行われます(A *を通過します)。唯一の例外は、デストラクタであり、shared_ptrはその "deleter"メカニズム(またはその一般化)を介して覚えている。 – nobar