我在"重新定义"时遇到了问题。析构函数。问题是我得到了一个我无法修改的结构定义。这是" leaf"一棵树目标是在返回指向剩余子树的指针时仅释放树的一部分。我的想法是使用引用计数。 这是给定的代码:
struct TLeaf {
TLeaf* m_L;
TLeaf* m_R;
~TLeaf(void) {
delete m_L;
delete m_R;
}
}
至少有办法避免调用这个析构函数吗?其实任何想法都是可以接受的。 :D
非常感谢Stack Overflow的好人。 :)
答案 0 :(得分:4)
您可以在删除节点之前nullptr
输出值。 delete ptr
ptr
nullptr
TLeaf* ltmp = node->m_L;
TLeaf* rtmp = node->m_R;
node->m_L = nullptr;
node->m_R = nullptr;
delete node;
// now use ltmp and rtmp as you need
是安全且无效的
{{1}}
答案 1 :(得分:0)
由于您无法修改TLeaf,您可以做的是修改用户代码。
0)如果您正在使用堆分配,请尝试operator delete(p)
而不是delete p
。
1)如果您正在使用堆栈分配,请避免直接使用类型TLeaf
:
char leaf[sizeof(TLeaf)];
new (leaf) TLeaf(...); // placement new