我看到了一些创建类对象向量的示例,其中许多使用了指针和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}}。上述方法有什么缺点吗?
答案 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
,