C ++ - 在创建类对象向量时使用delete的正确方法

时间:2017-04-03 00:42:58

标签: c++ class vector

我看到了一些创建类对象向量的示例,其中许多使用了指针和new关键字。但是,在许多情况下,delete不用于释放new分配的内存。我想知道以下代码是否正确使用delete

我有一个班级Marker

class Marker{

    public:
        Marker(int, float, float);
        int marker_id();

    private:
        int id;
        float mx;
        float my;
};

它的构造函数是:

Marker::Marker(int idno, float x, float y){

    //ctor
    id = idno;
    mx = x;
    my = y;
}

我需要一个带有marker_vec类对象或实例的向量Marker。因此,我编写了以下代码:

vector <Marker> marker_vec;

Marker *m = new Marker(last_id, m_x, m_y);
marker_vec.push_back(*m);
delete m;

如果我在循环中使用上述代码来创建marker_vec[0]marker_vec[1],我相信delete不会删除它们,只会释放指针{ {1}}。上述方法有什么缺点吗?

1 个答案:

答案 0 :(得分:1)

这段代码没问题,因为当你使用push_back时,m指针引用的内容将被复制并添加为vector的最后一个元素。通过释放正确设置的内存(每个都有相应的删除),你做得很好。

vector <Marker> marker_vec;

Marker *m = new Marker(last_id, m_x, m_y);
marker_vec.push_back(*m);
delete m;

我认为在这种情况下使用一种类型的Marker类和std::vector类型为<Marker>的指针是不必要的。

我个人会改进此代码的实现以进行静态实例化。在这种情况下,它简单而清洁:

vector <Marker> marker_vec;

Marker m(last_id, m_x, m_y);
marker_vec.push_back*m);

但是,如果您可能具有不同类型标记的继承:

class HighlighterMarker : public Marker { }; 

class PenMarker: public Marker { };

只有这样,你才能使用动态内存并将你的向量声明为:

std::vector <Marker*> marker_vec。这个可以存储您对任何类型的派生类Marker

的所有引用