如何访问超出范围的变量?

时间:2015-12-03 18:51:11

标签: c++ pointers

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搜索来解决问题。但是我无法让队列工作,因为我创建的对象子对象超出了范围。任何帮助都将不胜感激。

修改 在我的实际代码中,我遇到了麻烦,因为当对象超出范围时,它会向我显示这些内存分配。 enter image description here

此绿色部分是根节点所在的位置,红色部分是子节点的预期数据应该是的位置,但现在已删除。

2 个答案:

答案 0 :(得分:4)

变量queuefoo指针的向量,而不是foo个对象。但是在init()中,您将newFoo声明为foo对象并将其推入队列中。 newFoo是函数init()的局部变量,因此当函数完成执行时,newFoo将丢失。

您可以将newFoo声明为指针并为其分配内存,例如

foo *newFoo = new foo(queue, posNew);

并在队列中推送newFoo

答案 1 :(得分:1)

&#34;超出范围&#34;有两个含义:

  1. 通过函数调用,跳转到标识符词法范围之外的部分程序。该对象存在,但不能直接命名。间接(指针或引用)可能能够到达对象。

  2. 对于具有自动生命周期的对象,当到达范围的末尾时,对象将被销毁。在此之后无法访问该对象,因为它不再存在。

  3. 正如0605002所建议的,避免情况#2的一种方法是使用除自动之外的生命周期 - 他的答案显示了动态生命周期的一个例子,但静态生命周期也是可能的,并且数据成员的生命周期也超过了单个函数调用

    对于您的队列,由智能指针(std::unique_ptrstd::shared_ptr)管理的动态生命周期将是一个不错的选择。