在C 中使用智能指针时崩溃

Crashing when using smart pointer with vector in C++

本文关键字:指针 崩溃 智能      更新时间:2023-10-16

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

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

考虑您的智能指针类:

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),即 themable ,但 non -copyable:它仍然可以与std::vector这样的STL容器使用。

您可能还想阅读有关"三/五/零的规则" 在这里和这里。

您有两个"智能"指针的副本;ptrvector中的副本。默认分配运算符只是将内部指针复制到副本中,因此两个副本都指向同一对象。这是不好的,因为这两个副本都试图删除对象,只能完成一次。

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