关于自动或手动删除向量
About automatic or manual deletion of vectors
我阅读了其他问题,试图弄清楚这一点,但我没有找到像我心中所想的那样。我对c++有点陌生,我只是不想让我的c++代码看起来像"带类的C",或者换句话说,如果有一个好的"c++方式来做这个",这就是我在寻找的,但我有点困惑。好了,问题来了。
我有一个类,比如MyClass
。现在,在另一类中,比如MyContainer
,我有一个vector<MyClass> vec
。
假设我现在正在创建一个方法,该方法使用任意内容填充MyClass
对象,然后将其推入vec
。第一个问题是:我应该像下面这样分配和推送对象吗?(使用vector<MyClass> vec
)
MyClass *obj = new MyClass(args);
vec.push_back(*obj);
我不确定这是对的,但根据我的理解,这可以使我避免在MyContainer
的实例不再使用时手动删除我放入vec
的MyClass
的每个实例。
让我恼火的是,就像我说的,这似乎是不对的,我可以找出的另一种方法是声明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
如果你不需要多态行为,并且你的类是可复制的(要么你给它一个复制构造函数,要么默认的副本对你的实现是好的),那么你可以在堆栈上分配。
- 从向量的向量中删除向量的组合
- C++ 如何删除向量中的节点
- 删除向量中的空元素
- 删除向量中的指针会导致错误
- 如何通过索引中删除向量中的2个元素的每个倍数
- 在迭代过程中删除向量的唯一元素?
- 删除向量而不删除数组
- 向量问题,如何删除向量中的数组?
- 使用迭代列表中删除向量中的元素
- 如何按顺序删除向量中的重复值
- 擦除范围从std :: vector删除向量的最佳方法
- 在循环中删除向量的一个元素
- 删除向量的第一个元素并将其大小减小 1
- 如何删除向量的指针
- 正确删除向量的元素
- 删除向量中数字的单次出现,当数字在反向遍历时出现多次时
- 删除向量的第一个元素并释放C++中的内存
- 在 c++ 中删除向量的单个元素时出现问题
- C++如何删除向量中的特定对象
- 当包含对象包含unique_ptr时,如何删除向量的元素