扩展类时内存泄漏

时间:2014-01-25 21:12:49

标签: c++ memory-leaks raii

我有一个实现Trie的类,使用RAII精神创建,并且有一种方法可以使用它来泄漏内存,我不明白为什么。

班级代码:

 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 online编译。

我正在使用Visual Studio,但是当我在线编译时,我也发生了同样的事情 http://www.compileonline.com/compile_cpp_online.php

完整代码:

http://pastebin.com/qrd7pzMN(泄漏) http://pastebin.com/krVFBzmA

我之所以尝试两种方式,是因为我试图用C ++进行一些实验,虽然我知道非泄漏方式是编译后不那么臃肿,但我不喜欢使用的语法它

1 个答案:

答案 0 :(得分:1)

您需要有一个虚拟析构函数。

如果它不是虚拟的,则不会正确调用基类(或派生类)析构函数。

析构函数将被隐藏,如果它不是虚拟的,则不会被覆盖。