在C ++中使用带向量的智能指针时崩溃

时间:2016-12-01 15:17:17

标签: c++ pointers vector

我正在实现智能指针并尝试使用它的指针向量,这样一旦它超出范围我就不必删除指针。下面是我写的程序,但它崩溃了。有人可以帮帮我吗?

#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);
}

2 个答案:

答案 0 :(得分:3)

考虑你的智能指针类:

void CTouhouJGSView::OnBnClickedButtonUpdate()
{
    // TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다.
    CCommand<CDynamicAccessor> cmd;
    CString strQuery = _T("UPDATE dbo.TouhouTable SET 능력 = 'ewrer' WHERE id = 1");
    cmd.Open(m_pSet->m_session, strQuery, NULL);
    cmd.Close();

    cmd.OpenRowset(m_pSet); //<-- you can try to close it first, if its already opened
    AddAllRecord();
}

它缺乏复制操作的实施,例如复制构造函数和复制赋值。您可能想要添加这些。

此外,您可能希望添加移动操作的实现(例如移动构造函数和移动赋值)。

您还可以开发一个智能指针(例如像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;} }; 可移动 -copyable:它仍然可以使用STL容器,如{ {1}}。

您可能还想了解&#34;规则三/五/零&#34; herehere

答案 1 :(得分:1)

你有两个“智能”指针的副本; ptr以及vector中的副本。默认赋值运算符只是将内部指针复制到副本中,因此两个副本都指向同一个对象。这很糟糕,因为两个副本都试图删除该对象,并且只能执行一次。

如果您这样做是为了了解如何实现智能指针,我建议您阅读Scott Meyers的有效C ++书籍。但是,如果您使用现代C ++编写生产代码,则应使用std::shared_ptrstd::unique_ptr