我正在尝试使用在读取流时调用的一些处理函数来创建树结构。我认为问题是我的变量是在函数的范围内创建的,当函数结束时会消失,留下指向什么的指针。
我不确定将对象保留在内存中的方法,同时仍然允许树可伸缩。
我已经编写了一个简化版本的代码:它编译并运行了' 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;
}
答案 0 :(得分:2)
您的代码中存在几个问题。
您按值传递p_segCurrentseg
并指定给另一个指针。这对调用函数中的变量没有影响。
正如您所怀疑的那样,您正在尝试指定p_segCurrentseg
指向从函数返回时将消失的变量。
你能做什么:
通过引用传递p_segCurrentseg
。
从堆中创建一个对象,并指定p_segCurrentseg
指向它。
这是我对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类定义析构函数。在其中,遍历列表(子段)并为每个子节点释放内存。