gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 05:15:15 28 4
gpt4 key购买 nike

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

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com