我看到了一些创建类对象 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;
}
我需要一个 vector 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
的最后一个元素。 .您通过正确分配内存来做得很好(对于每个 new 都有一个相应的 delete)。
vector <Marker> marker_vec;
Marker *m = new Marker(last_id, m_x, m_y);
marker_vec.push_back(*m);
delete m;
我只是认为在这种情况下你没有必要使用指针,只有一种类型的标记类和你的 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 { };
只有到那时,您才可以使用动态内存并将 vector 声明为:
std::vector <Marker*> marker_vec
.这个可以存储您对任何类型的派生类的所有引用 Marker
,
关于C++ - 在创建类对象 vector 时使用 delete 的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43175066/