class foo{
vector<foo*>* queue;
vector<int> pos;
foo(vector<foo*>* queue, vector<int> pos){
this->queue=queue;
this->pos=pos;
}
public:
foo(vector<foo*>* queue){
this->queue=queue;
}
void init(){
vector<int> posNew = pos;
//Create Binary Tree Children of the state FOO
posNew.push_back(/* An Additional Value*/)
foo newFoo(queue, posNew);
queue->push_back(&newFoo);
}//Here the variables newFoo and posNew are out of scope so they are deleted even from the queue
}
class bar{
vector<foo*> queue; //Assume that queue has a root node added to it.
bar(){
for(unsigned int i=0; i<queue.size();i++){
queue[i]->init();// Somewhere along when the third element is calculated the value overflows since I assume the object are deleted
}
}
}
我正在尝试使用队列的BFS搜索来解决问题。但是我无法让队列工作,因为我创建的对象子对象超出了范围。任何帮助都将不胜感激。
修改 在我的实际代码中,我遇到了麻烦,因为当对象超出范围时,它会向我显示这些内存分配。
此绿色部分是根节点所在的位置,红色部分是子节点的预期数据应该是的位置,但现在已删除。
答案 0 :(得分:4)
变量queue
是foo
指针的向量,而不是foo
个对象。但是在init()
中,您将newFoo
声明为foo
对象并将其推入队列中。 newFoo
是函数init()
的局部变量,因此当函数完成执行时,newFoo
将丢失。
您可以将newFoo
声明为指针并为其分配内存,例如
foo *newFoo = new foo(queue, posNew);
并在队列中推送newFoo
。
答案 1 :(得分:1)
&#34;超出范围&#34;有两个含义:
通过函数调用,跳转到标识符词法范围之外的部分程序。该对象存在,但不能直接命名。间接(指针或引用)可能能够到达对象。
对于具有自动生命周期的对象,当到达范围的末尾时,对象将被销毁。在此之后无法访问该对象,因为它不再存在。
正如0605002所建议的,避免情况#2的一种方法是使用除自动之外的生命周期 - 他的答案显示了动态生命周期的一个例子,但静态生命周期也是可能的,并且数据成员的生命周期也超过了单个函数调用
对于您的队列,由智能指针(std::unique_ptr
或std::shared_ptr
)管理的动态生命周期将是一个不错的选择。