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



我看到了一些创建类对象向量的示例,其中许多使用指针和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不会删除它们,只会释放指针m。上述方法有什么缺点吗?

这段

代码没问题,因为当你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 类和类型 <Marker>std::vector

我个人会改进此代码的实现,以静态实例化。在这种情况下,它既简单又干净:

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的所有引用,

最新更新