【发布时间】:2017-04-03 00:42:57
【问题描述】:
我看到了一些创建类对象向量的示例,其中许多使用指针和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 类的对象或实例的向量 marker_vec。因此,我编写了以下代码:
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。上述方法有什么缺点吗?
【问题讨论】:
-
你可以这样做,但我不明白你为什么不直接说
marker_vec.emplace_back(Marker(last_id, m_x, m_y));(或push_back)。如果您的对象复制起来很便宜(而您的对象是),则可以不使用指针。如果您要存储OVERLAPPED结构,您还想使用指针(我有一个烦人的错误要追踪,因为它们中的内存必须保持在同一个地方,而我的向量正在将它们复制到整个地方)。跨度> -
为什么这么复杂?为什么不只是
marker_vec.emplace_back(last_id, m_x, m_y);? -
您发布的代码中根本不需要指针。
-
@H.DJEMAI 您不必添加
m = nullptr;。这是很多人建议的风格(尽管如果对象超出范围,我不会订阅它)。 Syamprasad:不是真的,因为您仍然将 RAIIMarker对象粘贴到向量中。如果对象的复制成本不高,您需要创建一个std::vector<Marker*>而不是std::vector<Marker>。 -
@SyamprasadKR 向量元素仍然是
Marker对象。emplace_back将其参数转发给元素类型的适当构造函数(在本例中为Marker)。我的代码会导致调用复制或移动构造函数,所以 Kerrek 的更好。