जब पढ़ने "के अलावा सी ++ स्टैंडर्ड लाइब्रेरी: एक परिचय बूस्ट करने के लिए", मैं एक बहुत ही दिलचस्प उदाहरण है:कितना बढ़ावा :: ~ 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 काम करता है? यह व्युत्पन्न कक्षा बी कैसे कम करता है?
आपकी मदद के लिए धन्यवाद अग्रिम!
- टेम्पलेट निर्माण समारोह
- संसाधन ~ shared_ptr में नष्ट नहीं किया है, यह:
धन्यवाद सब, मैं कैसे ~ 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_count
तकनीकी रूप से बोलते हुए, यह बी * से ए * में रूपांतरण करता है। सूचक के बाद की सभी पहुंच प्रकार ए * का उपयोग करेंगे। टाइप बी पर ऑपरेशंस मानक बहुरूपता के माध्यम से होते हैं (वे ए * के माध्यम से जाते हैं)। एकमात्र अपवाद विनाशक है, जिसे shared_ptr अपने "हटाना" तंत्र (या इसके कुछ सामान्यीकरण) के माध्यम से याद करता है। – nobar