2016-12-01 36 views
1

我正在實現智能指針並嘗試使用它的指針矢量,以便在指針超出範圍時不必刪除指針。下面是我編寫的程序,但它正在崩潰。有人可以幫助我嗎?在C++中使用帶有矢量的智能指針時崩潰

#include<iostream> 
#include<vector> 

using namespace std; 


template<class T> 
class smrtP 
{ 
    T *p; 
public: 
    smrtP(T* pp = NULL):p(pp) {} 
    ~smrtP() { delete p;} 

    T& operator*() {return *p;} 
    T* operator->() {return p;} 
}; 


class B 
{ 
public: 
    virtual void draw() = 0; 
    virtual ~B() { cout<<"~B"<<endl; } 
}; 

class D:public B 
{ 
public: 
    D() { cout<<"D"<<endl;} 
    virtual void draw() 
    { 
     cout<<"Draw D"<<endl; 
    } 
    virtual ~D() { cout<<"~D"<<endl; } 
}; 


int main() 
{ 
    typedef smrtP<B> sp; 
    vector<sp> v; 
    sp ptr(new D()); 
    v.push_back(ptr); 
} 
+4

您沒有實現複製構造函數或賦值運算符。 –

回答

3

考慮到你的智能指針類:

template<class T> 
class smrtP 
{ 
    T *p; 
public: 
    smrtP(T* pp = NULL):p(pp) {} 
    ~smrtP() { delete p;} 

    T& operator*() {return *p;} 
    T* operator->() {return p;} 
}; 

它缺乏執行複製操作,例如中複製構造函數和複製分配。你可能想要添加這些。

另外,您可能希望添加移動操作(例如移動構造函數和移動賦值)的實現。

您也可以開發一個智能指針(例如像std::unique_ptr)是移動 -copyable:它仍將與STL容器的工作就像std::vector

您可能還想了解「規則三/五/零」herehere

1

您有兩個「智能」指針副本; ptr,以及vector中的副本。默認賦值操作符只是將內部指針複製到副本中,因此兩個副本都指向同一個對象。這很糟糕,因爲這兩個副本都試圖刪除該對象,並且只能執行一次。

如果您正在學習如何實現智能指針,那麼我會建議閱讀Scott Meyers的有效C++書籍。但是,如果您正在使用現代C++編寫生產代碼,則應使用std::shared_ptrstd::unique_ptr