我有一个使用RAII精神创建的实现Trie的类,并且有一种使用它泄漏内存的方法,我不明白为什么。
班级代码:
template <typename T,typename C,int Base>
struct TrieNode
{
TrieNode* childs[Base];
T n;
unsigned int val;
void init(unsigned int val);
{
Created++;
this->val = val;
memset(childs, 0 ,sizeof(TrieNode*) * Base);
n = create_empty<T>();
}
TrieNode(int mult)
{
init(mult);
}
~TrieNode()
{
Deleted++;
for(int i=0;i<Base;i++)
delete childs[i];
}
T& create(unsigned int number,int mult);
C get_keys(int val);
TrieNode& move(TrieNode& other);
public :
TrieNode(){ init(1); }
TrieNode (const TrieNode& other)
{
move( const_cast<TrieNode&>(other) );
}
TrieNode& operator= (TrieNode other)
{
return move(other);
}
T& operator[](unsigned int number)
{
return this->create(number,1);
}
bool is_empty();
C get_keys();
};
现在,如果我这样做:
template<typename T,typename C>
struct TrieNodeTen
{
typedef TrieNode<T,C,10> type;
};
template <typename T>
struct TrieNodeTenVec
{
typedef typename TrieNodeTen<T,std::vector<int>>::type type;
};
TrieNodeTenVec< TrieNodeTenVec<bool>::type >::type trie;
我没有泄漏,但是如果我这样做:
template <typename T,typename C>
class TrieNodeTen1 : public TrieNode<T,C,10> {};
template <typename T>
class TrieNodeTenVec1 : public TrieNodeTen1<T,std::vector<int> > {};
TrieNodeTenVec1< TrieNodeTenVec1<bool> > trie;
我有些漏气。(泄漏的原因不是赋值运算符或构造函数,因为我在代码上使用了“ assert(0)”并且没有被调用。我删除了断言以在线使用gcc进行编译。
我正在使用Visual Studio,但是当我使用http://www.compileonline.com/compile_cpp_online.php在线编译时,我正在发生同样的事情
完整代码:
http://pastebin.com/qrd7pzMN(泄漏)http://pastebin.com/krVFBzmA
之所以尝试两种方式,是因为我正在尝试使用C ++进行一些实验,并且虽然我理解非泄漏方式在编译后会减少膨胀,但我不喜欢使用它的语法。
您需要有一个虚拟的析构函数。
如果不是虚拟的,则不会正确调用基类(或派生的)类析构函数。
析构函数将是隐藏的,如果不是虚拟的,则不会被覆盖。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句