gpt4 book ai didi

c++ - 扩展类时内存泄漏

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:24:31 26 4
gpt4 key购买 nike

我有一个实现 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;

我有一些泄漏。 (泄漏不是因为赋值运算符或构造函数,因为我在代码上使用了“断言(0)”并且它没有被调用。我删除了断言以使用 gcc 在线编译。

我正在使用 Visual Studio,但是当我使用 http://www.compileonline.com/compile_cpp_online.php

完整代码:

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

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

最佳答案

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

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

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

关于c++ - 扩展类时内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21356321/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com