Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/145.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.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++_String_Valgrind_Unordered Map - Fatal编程技术网

C++ 未初始化的值是由堆分配:无序_映射创建的

C++ 未初始化的值是由堆分配:无序_映射创建的,c++,string,valgrind,unordered-map,C++,String,Valgrind,Unordered Map,解决方案:我可以拥有巨大的字符串,然后我必须为它们保留内存。我在哈希表中使用char指针而不是string,因此我为哈希表键保留了适当的内存 问题: 如果这个问题已经提出了,我很抱歉,但是我找不到任何对我有帮助的答案 我有以下代码: 编辑(Valgrind有问题函数的主循环) i=0; wordPos=0; for(;it!=end;++it,i++){ //我想故意忽略这个元素 如果(i==1)继续; bool-isscript; 字符串标记(它->标记名()); 变流器功率(tag); 如果

解决方案:我可以拥有巨大的字符串,然后我必须为它们保留内存。我在哈希表中使用char指针而不是string,因此我为哈希表键保留了适当的内存

问题:

如果这个问题已经提出了,我很抱歉,但是我找不到任何对我有帮助的答案

我有以下代码:

编辑(Valgrind有问题函数的主循环)

i=0;
wordPos=0;
for(;it!=end;++it,i++){
//我想故意忽略这个元素
如果(i==1)继续;
bool-isscript;
字符串标记(它->标记名());
变流器功率(tag);
如果(it->isTag()==1){
如果(tag==“script”)isscript=true;
else isscript=false;
}
如果(it->isComment()==0&&it->isTag()==0&&isscript==0){
clear();
标记化(it->text(),单词列表);
int ii=0;
vector::iterator it_palavras=wordlist.begin();
vector::iterator it_words=wordlist.begin();
int ii=0;
while(iipush_back(wordpos));
countwords++;
}否则{
if(term_pos.find(voc[word])==term_pos.end())
术语_pos[voc[word]]=新向量();
术语[voc[word]]->推回(wordpos);
}
ii++;
}
}
voc的类型为无序映射,但当我在代码中运行valgrind时,会显示以下消息:

编辑现在,我正在粘贴带有标志的完整错误--track origins=yes

编辑2现在,我正在粘贴带有标志--dsymutil=yes的完整错误

==21036== Use of uninitialised value of size 8
==21036==    at 0x4201FF: _platform_memcmp (in /usr/lib/system/libsystem_platform.dylib)
==21036==    by 0x10001F10D:  std::__1::__hash_iterator<std::__1::__hash_node<std::__1::pair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, int>, void*>*> std::__1::__hash_table<std::__1::pair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, int>, std::__1::__unordered_map_hasher<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, int, std::__1::hash<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, true>, std::__1::__unordered_map_equal<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, int, std::__1::equal_to<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, true>, std::__1::allocator<std::__1::pair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, int> > >::find<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&) (string:642)
==21036==    by 0x10000358F: Colecao::ler_arvore_dom(tree<htmlcxx::HTML::Node, std::__1::allocator<tree_node_<htmlcxx::HTML::Node> > >, int, std::__1::unordered_map<int, std::__1::vector<int, std::__1::allocator<int> >, std::__1::hash<int>, std::__1::equal_to<int>, std::__1::allocator<std::__1::pair<int const, std::__1::vector<int, std::__1::allocator<int> > > > >&) (colecao.cpp:135)
==21036==    by 0x100002A19: Colecao::ler(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >) (colecao.cpp:73)
==21036==    by 0x100001781: main (index.cpp:47)
==21036==  Uninitialised value was created by a heap allocation
==21036==    at 0x70AB: malloc (in /usr/local/Cellar/valgrind/HEAD/lib/valgrind/vgpreload_memcheck-amd64-darwin.so)
==21036==    by 0x7528D: operator new(unsigned long) (in /usr/lib/libc++.1.dylib)
==21036==    by 0x77E12: std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::__init(char const*, unsigned long) (in /usr/lib/libc++.1.dylib)
==21036==    by 0x10001A0FF: std::__1::unordered_map<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, int, std::__1::hash<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::equal_to<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::allocator<std::__1::pair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const, int> > >::__construct_node(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&) (memory:1505)
==21036==    by 0x10000838D: std::__1::unordered_map<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, int, std::__1::hash<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::equal_to<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::allocator<std::__1::pair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const, int> > >::operator[](std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&) (unordered_map:1209)
==21036==    by 0x100003835: Colecao::ler_arvore_dom(tree<htmlcxx::HTML::Node, std::__1::allocator<tree_node_<htmlcxx::HTML::Node> > >, int, std::__1::unordered_map<int, std::__1::vector<int, std::__1::allocator<int> >, std::__1::hash<int>, std::__1::equal_to<int>, std::__1::allocator<std::__1::pair<int const, std::__1::vector<int, std::__1::allocator<int> > > > >&) (colecao.cpp:139)
==21036==    by 0x100002A19: Colecao::ler(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >) (colecao.cpp:73)
==21036==    by 0x100001781: main (index.cpp:47)
==21036==使用大小为8的未初始化值
==21036==at 0x4201FF:_platform_memcmp(在/usr/lib/system/libsystem_platform.dylib中)
==21036==by 0x10001F10D:std::\uuuu 1::\uuu散列\u迭代器std::\uuuu 1::\uu散列\u表::查找(std::\uuuu 1::基本字符串常量&)(字符串:642)
==21036==0x10000358F:Colecao::ler\u arvore\u dom(树,int,std::\u 1::无序映射&)(Colecao.cpp:135)
==21036==0x100002A19:Colecao::ler(标准:基本字符串,标准:基本字符串)(Colecao.cpp:73)
==21036==0x100001781:main(index.cpp:47)
==21036==堆分配创建了未初始化的值
==21036==0x70AB:malloc(in/usr/local/cell/valgrind/HEAD/lib/valgrind/vgpreload_memcheck-amd64-darwin.so)
==21036==by 0x7528D:运算符new(无符号长)(在/usr/lib/libc++.1.dylib中)
==21036==by 0x77E12:std::u 1::basic_string::u init(char const*,无符号长)(in/usr/lib/libc++.1.dylib)
==21036==by 0x1000010FF:std::_u1::无序映射::u构造节点(std::_u1::基本字符串常量&)(内存:1505)
==21036==by 0x10000838D:std::uu 1::无序映射::运算符[](std::u 1::基本字符串常量&)(无序映射:1209)
==21036==0x100003835:Colecao::ler_arvore_dom(树,int,std::_1::无序映射&)(Colecao.cpp:139)
==21036==0x100002A19:Colecao::ler(标准:基本字符串,标准:基本字符串)(Colecao.cpp:73)
==21036==0x100001781:main(index.cpp:47)
当我在大量数据中运行代码时,我得到了分段错误,我认为这是因为Valgrind错误

我不认为我需要在无序映射中为字符串保留空间,然后我发现这是word变量构造函数中的一些东西

我不知道如何解决这个字符串/无序映射/内存问题


编辑:GDB没有帮到我。分段错误只有在我使用了大量数据和大量内存时才出现。GDB唯一给我的是分段错误和内存地址。Valgrind给了我一个更完整的消息。

这实际上可能是Valgrind和
memcmp()之间的问题
平台的实现(我想是Mac OS X吧?)

应用程序中的未初始化值可能来自
std::string
构造函数中的
malloc()
调用,后者不太可能自行“创建”未初始化内存。因此我猜测malloc()分配的内存比需要的多一点(可能与8个字节对齐),以及
\u platform\u memcmp()
还考虑了这些字节。系统库通常具有此类函数的高度优化实现(memcpy、memcmp、strcpy…)。由于Valgrind在这些优化方面经常遇到问题,它提供了自己的替换函数(在mc_replace_strmem.c中)

可能Valgrind缺少这些OS X memcmp()的替代品,或者您的Valgrind版本太旧?此外,您的系统可能存在安装问题,导致Valgrind无法在运行时检测
memcmp()
函数(我不熟悉OS X,但可能您需要系统库的某种调试信息)

因此,有些问题:

  • 您正在运行最新的Valgrind版本吗?如果没有,请升级它
  • 您使用的是什么OSX版本
  • 如果在编译应用程序时禁用优化,问题是否会消失
如果这不起作用,您可能需要向Valgrind用户邮件列表()询问此特定问题


顺便说一句,在没有任何行号的情况下分析Valgrind回溯非常困难。请参阅以获取回溯中的行号信息的建议(简而言之:将“
--dsymutil=yes
”添加到Valgrind命令行-但首先查看此选项的注释).

为什么不详细说明一下//这里还有一些代码?您现在展示的代码片段是一个无休止的循环。如果您在一段时间内不使用迭代器,为什么要将迭代器添加到wordlist?通常,使用调试信息编译代码(对于g++:use-g),以获得行号。此外,下面的Valgrind输出“未初始化的值是由h创建的
==21036== Use of uninitialised value of size 8
==21036==    at 0x4201FF: _platform_memcmp (in /usr/lib/system/libsystem_platform.dylib)
==21036==    by 0x10001F10D:  std::__1::__hash_iterator<std::__1::__hash_node<std::__1::pair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, int>, void*>*> std::__1::__hash_table<std::__1::pair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, int>, std::__1::__unordered_map_hasher<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, int, std::__1::hash<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, true>, std::__1::__unordered_map_equal<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, int, std::__1::equal_to<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, true>, std::__1::allocator<std::__1::pair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, int> > >::find<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&) (string:642)
==21036==    by 0x10000358F: Colecao::ler_arvore_dom(tree<htmlcxx::HTML::Node, std::__1::allocator<tree_node_<htmlcxx::HTML::Node> > >, int, std::__1::unordered_map<int, std::__1::vector<int, std::__1::allocator<int> >, std::__1::hash<int>, std::__1::equal_to<int>, std::__1::allocator<std::__1::pair<int const, std::__1::vector<int, std::__1::allocator<int> > > > >&) (colecao.cpp:135)
==21036==    by 0x100002A19: Colecao::ler(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >) (colecao.cpp:73)
==21036==    by 0x100001781: main (index.cpp:47)
==21036==  Uninitialised value was created by a heap allocation
==21036==    at 0x70AB: malloc (in /usr/local/Cellar/valgrind/HEAD/lib/valgrind/vgpreload_memcheck-amd64-darwin.so)
==21036==    by 0x7528D: operator new(unsigned long) (in /usr/lib/libc++.1.dylib)
==21036==    by 0x77E12: std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::__init(char const*, unsigned long) (in /usr/lib/libc++.1.dylib)
==21036==    by 0x10001A0FF: std::__1::unordered_map<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, int, std::__1::hash<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::equal_to<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::allocator<std::__1::pair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const, int> > >::__construct_node(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&) (memory:1505)
==21036==    by 0x10000838D: std::__1::unordered_map<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, int, std::__1::hash<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::equal_to<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::allocator<std::__1::pair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const, int> > >::operator[](std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&) (unordered_map:1209)
==21036==    by 0x100003835: Colecao::ler_arvore_dom(tree<htmlcxx::HTML::Node, std::__1::allocator<tree_node_<htmlcxx::HTML::Node> > >, int, std::__1::unordered_map<int, std::__1::vector<int, std::__1::allocator<int> >, std::__1::hash<int>, std::__1::equal_to<int>, std::__1::allocator<std::__1::pair<int const, std::__1::vector<int, std::__1::allocator<int> > > > >&) (colecao.cpp:139)
==21036==    by 0x100002A19: Colecao::ler(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >) (colecao.cpp:73)
==21036==    by 0x100001781: main (index.cpp:47)