关于向量的自动或手动删除

时间:2014-05-14 01:58:09

标签: c++ allocation

我读了其他问题试图解决这个问题,但我没有找到与我的想法相似的东西。我是C ++的新手,我不想让我的C ++代码看起来像是" C与类",或者换句话说,如果有一个好的" ; C ++这样做的方式",这就是我正在寻找的东西,但我有点困惑。好吧,问题。

我有一节课,说MyClass。现在,在其他课程中,比如MyContainer,我有vector<MyClass> vec

我们现在说我正在创建一个方法,用任意内容填充MyClass个对象,然后将其推送到vec。第一个问题是:我应该分配和推送对象如下? (使用vector<MyClass> vec

MyClass *obj = new MyClass(args);

vec.push_back(*obj);

我不确定这是对的,但根据我的理解,这可以让我避免在MyClass的实例时手动删除vec的{​​{1}}的每个实例没用了。

对我来说有什么不好的是,就像我说的那样,这似乎并不正确,而我能想出的另一种方式是声明MyContainer并写作:

vector<MyClass*>

但这会让我写一个方法来删除我之前创建的MyClass *obj = new MyClass(args); vec.push_back(obj); 的每个实例,对吗?

那么......我应该使用什么,如果两者实际上是正确的,那么当一个人更喜欢另一个时呢?

但是,如果从一开始就出现问题,我该怎么做?

谢谢你!

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

编辑:我无法使用C ++ 11。

PS2:这是作业的一部分,但我发现它足以让任何人使用,而不仅仅是我。

2 个答案:

答案 0 :(得分:4)

你可能不应该使用new,除非你需要让对象超出变量的局部范围。

只需在堆栈中声明它:

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

在C ++ 11中,您可以使用以下命令避免额外的obj副本的风险:

vec.emplace_back(args);

答案 1 :(得分:4)

是否应该按照@happydave的建议在堆或堆栈上进行分配,这在很大程度上取决于&#34; MyClass&#34;,IMO的性质。如果你需要任何类型的多态行为(即你可能有MyClass的专门子类),那么你应该有一个指针容器。

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

1。使用shared_ptr。所以你的代码可能如下所示:

typedef std::shared_ptr<MyClass> MyClassPtr;

...

vector<MyClassPtr> vec;
vec.push_back(MyClassPtr(new MyClass());

当没有更多的引用时,智能指针会自动删除MyClass。

2。如果你使用裸指针,你仍然可以使用std :: for_each删除所有带有一行代码的指针。这在此处描述:Can I call `delete` on a vector of pointers in C++ via for_each <algorithm>?

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