C++ 扩展类时内存泄漏

C++ 扩展类时内存泄漏,c++,memory-leaks,raii,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++

我有一个实现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();
    };
模板
结构三节点
{
三元组*儿童[基];
T n;
无符号int-val;
void init(无符号int val);
{
创建++;
这->val=val;
memset(childs,0,sizeof(三元组*)*Base);
n=创建_empty();
}
三节点(int mult)
{
init(mult);
}
~triode()
{
删除++;
for(inti=0;icreate(数字,1);
}
布尔是空的();
C获取密钥();
};
现在如果我这样做:

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;
模板
结构三分体
{
类型定义三节点类型;
};
模板
三元结构
{
typedef-typename-trieodeen::type-type;
};
trieodetenvec::type trie;
我没有泄漏,但如果我这样做:

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;
模板
三元组1类:公共三元组{};
模板
三年制课程1:公共三年制课程1{};
trieodetenvec1trie;
我有一些泄漏。(泄漏不是因为赋值运算符或构造函数,因为我在代码上使用了“assert(0)”,没有调用它。我删除了assert以使用gcc online进行编译

我使用的是VisualStudio,但当我使用

完整代码:

(泄漏)


我之所以尝试两种方法是因为我尝试用C++进行一点实验,而我理解编译后的非泄漏方式没有那么臃肿,我不喜欢使用它的语法。

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


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

只是使它成为虚拟的?它仍在泄漏:@user246100您的计数是错误的。请在每个构造函数中增加一个增量,而不是每个init。我希望您注意到,您的计数中删除的次数比构造的次数多。这意味着计数错误,而不是内存泄漏。天哪,谢谢,我在发布模式下使用了assert(0),所以我认为其他构造函数没有被访问。然后我在init中保持“Created”。谢谢!你的代码实际上很难理解..我不得不在两个pastebin链接上做一个“diffchecker.com”来查看差异..我不确定是否称之为“内存泄漏”.你只是多次删除你的指针?这就是你的代码似乎要打印出来的内容。你缺少了很多东西,这就是“RAII”。移动、复制和赋值。正如Yochai所说,我并没有递增“Created”一直以来,我都应该这样做,因为它报告了更多创建的删除。很抱歉代码很难理解,我是一个新手。关于RAII部分,我缺少哪些函数?我创建了两个用于构造和分配的函数,用于将旧类中的数据移动到新类中。