Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/157.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++;类构造中的内存泄漏 我写一些C++,试图用数组实现哈希表。< /P>_C++_Memory - Fatal编程技术网

C++;类构造中的内存泄漏 我写一些C++,试图用数组实现哈希表。< /P>

C++;类构造中的内存泄漏 我写一些C++,试图用数组实现哈希表。< /P>,c++,memory,C++,Memory,散列函数取自堆栈溢出post 由于哈希表在运行时动态调整大小,因此实现了以下简单策略: 按%表的总大小插入元素 当插入的元素(=当前大小)>=表的总大小时,# 创建一个大小为两倍的新表,然后重新插入所有元素 该表的每个存储桶都包含一个值和一个布尔值,指示所述元素是否应位于表中 请注意,该表仅用于非负整数值 我无法通过表格结构: 内存使用率逐渐增加,CPU也在增加 这意味着在何时增加表的大小时,存在与条件检查相关的问题 表的构造函数和析构函数: //我在这里定义它们是因为它们取决于整数的位大小

散列函数取自堆栈溢出post

由于哈希表在运行时动态调整大小,因此实现了以下简单策略:

  • %表的总大小插入元素
  • 当插入的元素(=当前大小)>=表的总大小时,
    #
  • 创建一个大小为两倍的
    新表
    ,然后重新插入所有元素
该表的每个存储桶都包含一个值和一个布尔值,指示所述元素是否应位于表中

请注意,该表仅用于非负整数值

我无法通过表格结构: 内存使用率逐渐增加,CPU也在增加

这意味着在何时增加表的大小时,存在与条件检查相关的问题

表的构造函数和析构函数:

//我在这里定义它们是因为它们取决于整数的位大小。
#定义反向0x119de1f3
#定义哈希器0x45d9f3b
哈希表::哈希表(大小\u t初始大小,uint32\u t*初始数据)
{
总尺寸=4U*初始尺寸;
当前大小=初始大小;
数据=新表格[总大小];
构建(初始_数据);
}
哈希表::~HashTable()
{
删除[]数据;
总尺寸=0U;
当前_大小=0U;
}
为了构建,我们散列并将每个初始元素(插入)到表中:

void HashTable::build(uint32\u t*初始数据)
{
用于(尺寸i=0U;i<当前尺寸;i+=1U)
{
插入(初始_数据[i]);
}
}
要插入,我们还使用哈希函数:

void哈希表::插入(uint32\u t num)
{
uint32_t index=hash(num);
尝试
{
数据[索引].num=num;
数据[索引].exists=true;
当前_大小+=1U;
}
捕获(超出范围和错误)
{
;//写完主文后要做的事情。
}
}
uint32\u t哈希表::哈希(uint32\u t num)
{
如果(当前大小>=总大小/2U){
双表();
用于(尺寸i=0U;i<当前尺寸;i+=1U)
{
插入(数据[i].num);
}
}
num=((num>>16)^num)*HASHER;
num=((num>>16)^num)*HASHER;
num=(num>>16)^num;
返回值(总大小的百分比);
}
最后,这里是一个虚拟主函数:

int main(无效)
{
uint32_t初始数据[3]={1,3,5};
哈希表h(3U,初始数据);
返回0;
}
以下是表格的结构:

struct表
{
uint32_t num;
bool exists=false;
};
以及有关定义:

类哈希表
{
私人:
表*数据;
大小\u t总大小;
大小\u t当前大小;
uint32\u t哈希(uint32\u t num);
uint32_t unhash(uint32_t num);
无效构建(uint32\u t*初始数据);
void双表(void);
公众:
哈希表(大小\u t初始大小,uint32\u t*初始数据);
~HashTable();
无效插入(uint32\u t num);
使用
-ggdb3
编译并运行valgrind后,我得到一个大小为8的未初始化值

以下是一些valgrind日志:

--1632-- Valgrind options:
--1632--    --leak-check=full
--1632--    --show-leak-kinds=all
--1632--    --track-origins=yes
--1632--    --verbose
--1632--    --log-file=valgrind-out.txt
我已经看过了这篇关于的文章

我错过了什么

如果你想进一步分类,或者想让我进一步解释我的思维过程,请告诉我

提前感谢:)

xlxs4:

这不应该像@Frank上面所说的那样重复。尽管如此,我还是找到了答案。我根据三个原则重新编写了代码,并使用了初始化列表。我在帖子中描述的问题的原因是,我
build
是否分配?请注意,当您尝试在更复杂的上下文中使用它时,您的类型似乎不尊重,并且可能有未定义的行为。您需要熟悉/Sorry,我遗漏了这一点。有时,它会通过调用
hash
间接执行。我将在帖子中添加代码。它基本上遍历作为输入的数组中的每个元素并对其进行散列,
插入
将其放入表中。
表::num
处于未初始化状态,因此当您将表变大时,这些值的副本来自未初始化的值。
==1632== Use of uninitialised value of size 8
==1632==    at 0x1093E8: HashTable::insert(unsigned int) (in /home/xlxs4/Git/CCDT/src/structures/hashtable/a.out)
==1632==    by 0x1095DC: HashTable::hash(unsigned int) (in /home/xlxs4/Git/CCDT/src/structures/hashtable/a.out)
==1632==    by 0x1093BD: HashTable::insert(unsigned int) (in /home/xlxs4/Git/CCDT/src/structures/hashtable/a.out)
==1632==    by 0x1096B0: HashTable::build(unsigned int*) (in /home/xlxs4/Git/CCDT/src/structures/hashtable/a.out)
==1632==    by 0x10933C: HashTable::HashTable(unsigned long, unsigned int*) (in /home/xlxs4/Git/CCDT/src/structures/hashtable/a.out)
==1632==    by 0x10920A: main (main.cpp:15)
==1632==  Uninitialised value was created by a heap allocation
==1632==    at 0x483950F: operator new[](unsigned long) (vg_replace_malloc.c:423)
==1632==    by 0x1092F7: HashTable::HashTable(unsigned long, unsigned int*) (in /home/xlxs4/Git/CCDT/src/structures/hashtable/a.out)
==1632==    by 0x10920A: main (main.cpp:15)