我看到了一些创建类对象向量的示例,其中许多使用指针和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
的所有引用,