我试图打印出存储在包含类实例的向量中的项目,例如:
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;
答案 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();