template <class T>
。问题在于,像STL列表一样,如果它遇到多态类问题,即树中的对象是指向堆基础对象的指针(如指向基类的指针),则节点被删除时这些对象不会被销毁。因此,我的选择是:1.使用boost::shared_ptr的树,但这比我想要的更昂贵/过度。2.编写一个小指针包装器,就像我下面编写的那个一样。其想法是将指针包装起来,当它超出范围时,删除其指针。它没有引用计数,只保证指针的销毁。template<class T>
class TWSafeDeletePtr
{
private:
T *_ptr;
public:
TWSafeDeletePtr() : _ptr(NULL) {}
TWSafeDeletePtr(T *ptr) : _ptr(ptr) {}
~TWSafeDeletePtr()
{
delete _ptr;
}
T &operator=(T *ptr)
{
assert(!_ptr);
delete _ptr;
_ptr=ptr;
return *ptr;
}
void set(T *ptr)
{
*this=ptr;
}
T &operator*() const { return *_ptr; }
T *operator->() const { return _ptr; }
};
3: 编写自己的分配器,从池中分配节点对象并在deallocate()中删除指向的内存。
4: 专门设计代码以创建指针树,避免初始分配和复制构造,并且本质上知道如何删除指向的数据。
我已经让选项2起作用了,但我并不是很满意,因为我必须先插入一个空指针,然后在插入返回迭代器时设置指针。这是因为树使用复制构造函数,因此在堆栈上传递的临时对象最终会在其超出范围时删除指针。所以我在返回时设置了指针。它有效,而且隐藏得很好,但我不喜欢它。
选项3看起来是最佳选择,不过我想问一下是否有其他人已经做过这个,或者有其他建议?
好的,我决定选择选项1(共享指针树),主要是因为它使用标准库,而且每个节点的额外引用计数不会太高。谢谢大家的回复:)
致敬,
Shane