C++ 关于自动或手动删除向量

C++ 关于自动或手动删除向量,c++,allocation,C++,Allocation,我读了其他的问题试图弄明白这一点,但我并没有找到我想要的。我对C++有点陌生,我不想让我的C++代码看起来像“C类”,换句话说,如果有一个好的“C++方式来做这个”,那就是我所要寻找的,但是我有点困惑。好吧,这是个问题 我有一门课,比如说MyClass。现在,在另一个类中,比如说MyContainer,我有一个向量vec 假设我现在正在创建一个方法,用任意内容填充MyClass对象,然后将其推入vec。第一个问题是:我应该像下面这样分配和推送对象吗?(使用向量向量向量 我不确定这是否正确,但据我

我读了其他的问题试图弄明白这一点,但我并没有找到我想要的。我对C++有点陌生,我不想让我的C++代码看起来像“C类”,换句话说,如果有一个好的“C++方式来做这个”,那就是我所要寻找的,但是我有点困惑。好吧,这是个问题

我有一门课,比如说
MyClass
。现在,在另一个类中,比如说
MyContainer
,我有一个
向量vec

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

我不确定这是否正确,但据我所知,这可以避免在
MyContainer
的实例不再使用时,手动删除我放入
vec
MyClass
的每个实例

让我感到困扰的是,正如我所说的,这似乎无论如何都不对,我可以找出的另一种方法是声明
vector
并编写:

MyClass *obj = new MyClass(args);

vec.push_back(obj);
但这会让我编写一个方法来删除我以前创建的
MyClass
的每个实例,对吗

所以。。。我应该使用什么?如果两者都是正确的,当一个比另一个更可取时,我应该使用什么

然而,如果从一开始一切都是错的,我怎么能做到这一点

谢谢亚尔

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

编辑:我不能使用C++11


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

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

只需在堆栈上声明它:

MyClass obj(args);
vec.push_back(obj);
在C++11中,您可以使用以下方法避免额外复制obj的风险:

vec.emplace_back(args);

依我看,您是否应该按照@happydave的建议在堆或堆栈上进行分配在很大程度上取决于“MyClass”的性质。如果您需要任何类型的多态行为(即,您可能有MyClass的专用子类),那么您应该有一个指针容器

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

一,。使用共享ptr。因此,您的代码可能如下所示:

typedef std::shared_ptr<MyClass> MyClassPtr;

...

vector<MyClassPtr> vec;
vec.push_back(MyClassPtr(new MyClass());
typedef std::shared_ptr MyClassPtr;
...
向量向量机;
vec.push_back(MyClassPtr(newmyclass());
当不再有对MyClass的引用时,智能指针将自动删除MyClass

2.如果您使用裸指针,您仍然可以使用std::for_删除所有带有一行代码的指针。如下所述:


如果您不需要多态行为,并且您的类是可复制的(或者您为它提供了一个副本构造函数,或者默认副本对您的实现很好)你的意思是,如果我在堆栈上声明它,当我将对象复制到向量中时,我就不必担心在函数结束并且我们离开它的作用域时,会把所有的东西都搞乱?对。这意味着在我的第一个例子中,从技术上讲,你将有两个对象的副本——一个在stac上k、 这就是为什么emplace_back更好的原因,尤其是如果对象的构造成本很高,我恐怕不能使用C++11(请参见上面的编辑和PS2)。但我做得很好。谢谢。:)顺便说一句:向上投票并标记为答案。然后你应该返回vec.back()小心返回引用(或迭代器或指针)对于您刚刚推送的对象,因为它可能会因后续的推送而无效。如果您知道向量在开始时有多大,可以先调用resize来防止出现这种情况。或者您可以将索引返回到向量中。或者在堆上分配并存储指针,最好是智能指针。即使没有C++11,您也应该有一些共享ptr的味道(例如boost)。它甚至可能值得构建一个向量,其大小将填充默认构造的MyClass。明白你的意思了,它回答了同样的疑问(多态性)。但就这一次而言,情况并非如此。如果您还没有这样做,那么值得一读关于RAII的内容——“资源获取是初始化”例如——在这种方法下,堆栈对象的析构函数中会自动发生删除。
typedef std::shared_ptr<MyClass> MyClassPtr;

...

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