打印动态数组中的项目

时间:2016-04-07 02:41:05

标签: c++

我试图打印出存储在包含类实例的向量中的项目,例如:

vector<Tree *> vec_;

据我所知,为了将一个项插入到向量中,我可以动态分配内存以将Tree对象插入到向量中,例如:

方法1:

Tree * obj = new Tree();
vec_.push_back(obj);

方法2:

vec_.push_back(new Tree());

首先,我想知道如何为方法2删除动态分配的内存,因为我理解方法1,我会做类似的事情:

delete obj;

最后我在打印出向量中的项目时遇到问题,我收到一条错误,指出二进制表达式存在无效的操作数(我不确定这意味着什么)这就是我&# 39;尝试过:

vec_.push_back(obj); //this is just to show that the vector is populated. (pseudo)
vec_.push_back(obj1);
vec_.push_back(obj2);
vec_.push_back(obj3);
for(int i = 0; i < vec_.size();i++)
    cout << *(vec_[i]) << endl;

2 个答案:

答案 0 :(得分:0)

删除方法2的动态分配内存:

Tree *obj = vec_.back();
vec_.pop_back();
delete obj;
obj = NULL;

答案 1 :(得分:0)

  

我明白为了将一个项目插入到矢量中,我会   需要动态分配内存

您的理解不正确。在您显示的示例中,您的向量包含指向Tree个对象的指针。您不需要动态分配Tree个对象,只需将它们插入到向量中即可。您可以将任何指向Tree对象的指针插入向量中。它当然可以分配,但不一定是:

Tree obj;

vec_.push_back(&obj);

现在,可能还有其他原因导致您不想这样做,这是真的。

您可以多次将同一个对象推入向量:

Tree *obj=new Tree();

vec_.push_back(obj);
vec_.push_back(obj);

所有vec_都是指向Tree的指针的向量。而已。而已。没有其他的。这些指针来自哪里,你的vec_并不关心。这不属于它的业务。

现在,回到删除Tree的主题。你需要了解的第一件事是,如果你仍然有原始的obj指针,那么只是因为你做了

delete obj;

这并不意味着vec_中指向同一个对象的指针神奇地消失了。它仍将存在。如果您尝试使用它并取消引用它,则会导致未定义的行为,这通常是崩溃。欢迎来到C ++。

现在,也许在你重读了上面几段之后,你或许可以找出你上一个问题的答案,如果不使用临时obj指针,如何解除分配对象,在它被推回vec_数组之前。

确实,您必须删除已分配的对象,但不需要原始指针。例如,您所谓的“方法1”可能是:

Tree *obj=new Tree();

vec_.push_back(obj);

delete vec_.back();   // Instead of delete obj;
vec_.pop_back();

您将指针推到向量背面的对象。要删除它,请将指针放在向量的后面,这是与您分配的对象相同的对象,然后将其删除。并且,为了确保您的向量不再包含无效指针,对于已删除的对象,您pop_back()

那么,你会为你所谓的“方法2”做些什么?你会相信完全相同的事情吗?

vec_.push_back(new Tree());

delete vec_.back();
vec_.pop_back();