c ++指针和变量范围

时间:2014-05-19 05:07:07

标签: c++ pointers

我正在尝试使用在读取流时调用的一些处理函数来创建树结构。我认为问题是我的变量是在函数的范围内创建的,当函数结束时会消失,留下指向什么的指针。

我不确定将对象保留在内存中的方法,同时仍然允许树可伸缩。

我已经编写了一个简化版本的代码:它编译并运行了' Segment'的父子关系。对象都错了。

class Segment
{
public:
    Segment* parent;
    list<Segment*> children;
    string name;
};

void OpenSegment(Segment* p_segCurrentseg);
void CloseSegment(Segment* p_segCurrentseg);

int _tmain(int argc, _TCHAR* argv[])
{
    Segment parent;
    parent.name="parent";
    Segment* p_segCurrentseg=&parent;
    OpenSegment(p_segCurrentseg);
    OpenSegment(p_segCurrentseg);
    OpenSegment(p_segCurrentseg);
    CloseSegment(p_segCurrentseg);
    return 0;
}

void OpenSegment(Segment* p_segCurrentseg)
{
    Segment child;
    child.name="child";
    p_segCurrentseg->children.push_front(&child);
    child.parent=p_segCurrentseg;
    p_segCurrentseg=&child;
}

void CloseSegment(Segment* p_segCurrentseg)
{
    p_segCurrentseg=p_segCurrentseg->parent;
}

2 个答案:

答案 0 :(得分:2)

您的代码中存在几个问题。

  1. 您按值传递p_segCurrentseg并指定给另一个指针。这对调用函数中的变量没有影响。

  2. 正如您所怀疑的那样,您正在尝试指定p_segCurrentseg指向从函数返回时将消失的变量。

  3. 你能做什么:

    1. 通过引用传递p_segCurrentseg

    2. 从堆中创建一个对象,并指定p_segCurrentseg指向它。

    3. 这是我对OpenSegment的建议:

      void OpenSegment(Segment*& p_segCurrentseg)
      {
          Segment* child = new Segment;
          child->name="child";
          p_segCurrentseg->children.push_front(child);
          child->parent=p_segCurrentseg;
          p_segCurrentseg=child;
      }
      

答案 1 :(得分:0)

问题出在OpenSegment()方法中,特别是在以下3行中:

Segment child;
child.name="child";
p_segCurrentseg->children.push_front(&child);

首先,child是一个局部变量并在堆栈上创建。然后,将子地址推送到列表中。当OpenSegment()返回时,子地址包含垃圾,因为释放了本地变量的存储空间。

解决方案是将child定义为Segment的指针,在堆上创建它,使其在OpenSegment()返回后仍然存在。你必须确保释放它的内存。正确的地方是为Segment类定义析构函数。在其中,遍历列表(子段)并为每个子节点释放内存。