关于自动或手动删除向量

About automatic or manual deletion of vectors

本文关键字:删除 向量 于自动      更新时间:2023-10-16

我阅读了其他问题,试图弄清楚这一点,但我没有找到像我心中所想的那样。我对c++有点陌生,我只是不想让我的c++代码看起来像"带类的C",或者换句话说,如果有一个好的"c++方式来做这个",这就是我在寻找的,但我有点困惑。好了,问题来了。

我有一个类,比如MyClass。现在,在另一类中,比如MyContainer,我有一个vector<MyClass> vec

假设我现在正在创建一个方法,该方法使用任意内容填充MyClass对象,然后将其推入vec。第一个问题是:我应该像下面这样分配和推送对象吗?(使用vector<MyClass> vec)

MyClass *obj = new MyClass(args);
vec.push_back(*obj);

我不确定这是对的,但根据我的理解,这可以使我避免在MyContainer的实例不再使用时手动删除我放入vecMyClass的每个实例。

让我恼火的是,就像我说的,这似乎是不对的,我可以找出的另一种方法是声明vector<MyClass*>并写:

MyClass *obj = new MyClass(args);
vec.push_back(obj);

但是这会让我写一个方法来删除我之前创建的MyClass的每个实例,对吗?

所以…我应该用什么,如果两者都是正确的,当一个比另一个更好的时候?

然而,如果一切从一开始就错了,我怎么能做到这一点?

谢谢yall !

PS:顺便说一下,MyContainer是在main()中创建的。我计划使用堆分配。我应该吗?

编辑:我不会用c++ 11。

PS2:这是作业的一部分,但我发现它足够通用,对任何人都有用,而不仅仅是我。

除非您需要对象在变量的局部作用域之外继续存在,否则您可能不应该使用new。

直接在栈上声明:

MyClass obj(args);
vec.push_back(obj);

在c++ 11中,您可以使用:

来避免任何额外的obj副本的风险:
vec.emplace_back(args);

是否应该像@happydave建议的那样在堆上分配还是在堆栈上分配,在我看来,这高度依赖于"MyClass"的性质。如果你需要任何类型的多态行为(即你可能有MyClass的专门子类),那么你应该有一个指针的容器。

如果您担心需要单独删除每个条目,有两件事可能会帮助您:

1。要查看使用。所以你的代码可能看起来像这样:

typedef std::shared_ptr<MyClass> MyClassPtr;
...
vector<MyClassPtr> vec;
vec.push_back(MyClassPtr(new MyClass());

当MyClass不再被引用时,智能指针会自动删除它。

2。如果您使用裸指针,您仍然可以使用std::for_each一行代码删除所有指针。我可以在c++中通过for_each 对指针向量调用' delete '吗?

如果你不需要多态行为,并且你的类是可复制的(要么你给它一个复制构造函数,要么默认的副本对你的实现是好的),那么你可以在堆栈上分配。