【发布时间】:2016-02-19 20:24:41
【问题描述】:
我正在实现一棵树,每个节点里面都有 Node** 供儿子使用:
class Node {
string word;
Node* father;
Node** sons;
int sonsNum;
....
}
为了插入新儿子,我无法找到一种方法,而不是制作 Node* 的 new[] 数组并删除旧的(我不能使用列表,我被重新调整了......)。但是当使用 delete[] 删除旧的 Node** 时,即使我已经将指针保存到另一个 tmp 数组中,它的值也会消失! (甚至 Node destructor 也是空的!为什么?)。所以如果我使用 shared_ptr 我认为它会解决它,有没有办法在没有 shared_ptr 的情况下做到这一点?
void insertSon(Node* sn) {
sn->father=this;
Node** tmpSons = sons; //should be shared_ptr? but I dont want that
if(sons)
//delete[](sons); // after this line, tmpSons has garbage!
sons = new Node*[sonsNum+1];
for(int i=0 ; i<sonsNum ; i++) {
sons[i]=tmpSons[i];
}
sons[sonsNum]=sn;
sonsNum++;
}
编辑: 抱歉忘了说我想要节点内的真实值,所以我不能复制。 (此代码中的字符串仅用于示例......它是另一个真实的对象......)
编辑: 解决方案:
void insertSon(Node* sn) {
sn->father=this;
Node** tmpSons = new Node*[sonsNum];
for(int i=0 ; i<sonsNum ; i++) {
tmpSons[i]=sons[i];
}
if(sons)
delete[](sons);
sons = new Node*[sonsNum+1];
for(int i=0 ; i<sonsNum ; i++) {
sons[i]=tmpSons[i];
}
sons[sonsNum]=sn;
sonsNum++;
delete[](tmpSons);
}
【问题讨论】:
-
您只需复制指针的值并删除它指向的内容。指针不计入引用计数。
-
抱歉忘了说我想要节点内的真实值
-
为什么不直接分配指针而不删除原来的?
-
因为我需要更大的。所以我需要新的[old_size +1]。然后必须删除旧的!
-
你可以把节点放在
vector<Node*>
标签: c++ arrays destructor shared-ptr