我无法阻止指针指向的对象被释放。我认为这是问题,但我不知道如何解决它。
我的代码:
enum TOKEN_TYPE {
OPEN, CLOSE, TEXT
};
struct Token {
int type;
std::string value;
};
typedef std::vector<Token>::iterator token_it;
Tree::Tree(token_it start) {
root.value = start->value;
createNode(++start, &root);
}
void Tree::createNode(token_it it, Node* parent) {
Node current;
current.value = it->value;
current.parent = parent;
if(parent != 0) {
parent->children.push_back(¤t);
}
++it;
while(it->type != TOKEN_TYPE::CLOSE && it->value != current.value) {
if(it->type == TOKEN_TYPE::OPEN) {
createNode(it, ¤t);
}
++it;
}
}
我尝试逐步完成程序,一切都很完美,直到程序开始退出createNode
调用,垃圾收集释放current
,parent
指向任何内容;至少这是我认为正在发生的事情。
答案 0 :(得分:3)
首先,C ++中没有垃圾收集。
其次,使用智能指针而不是原始指针:
void Tree::createNode(token_it it, SmartPtr<Node> parent)
第三,你的假设是正确的:
{
Node current;
parent->children.push_back(¤t);
} //current is destroyed here
这是因为在{strong>自动存储中分配了current
。
如果您管理parent
内的内存,则可以创建当前节点动态:
{
Node* current = new Node;
parent->children.push_back(current);
}