C++ - 在创建类对象 vector 时使用 delete 的正确方法

标签 c++ class vector

我看到了一些创建类对象 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/

相关文章:

c++ - ostream_iterator的声明

c++ - 在纯 C++ 中创建 BMP

c++ - 为什么下面的程序在不使用互斥量时不混合输出?

c++ - 如何在 C++ 中将 base64 字符串转换为十六进制字符串?

python - 定义许多相同类型的对象的内存效率更高的方法

jquery - 动态读取类名并配对/追加匹配的 div

c++ - 如何管理不同类中原始指针和 unique_ptr 的混合使用? (异常(exception)?)

matlab - 如何在 matlab 中分析矢量外积

java - 如何以编程方式在 Android 中从位图创建 SVG 文件?

matlab - 如何标准化 3-D 向量矩阵