Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/134.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++ 使用“sYSMALLOc”时sYSMALLOc断言失败;新";关键词_C++_Gdb_New Operator_Valgrind - Fatal编程技术网

C++ 使用“sYSMALLOc”时sYSMALLOc断言失败;新";关键词

C++ 使用“sYSMALLOc”时sYSMALLOc断言失败;新";关键词,c++,gdb,new-operator,valgrind,C++,Gdb,New Operator,Valgrind,编辑:为了清楚起见,我将保留问题原样。这个 问题似乎是Kameleon类使用了boost,并且自 我自己的代码也使用它,可能有冲突的版本和 这就是问题的根源 原始问题: 很多信息,但我试着把它归结为有趣的部分。我正在编写一个应用程序,它使用类的实例来执行各种任务。当我试图使用new关键字分配实例时,我遇到了麻烦。以下是问题的简化版本: #include <ccmc/Kameleon.h> int main() { ccmc::Kameleon k; ccmc::Kamele

编辑:为了清楚起见,我将保留问题原样。这个 问题似乎是
Kameleon
类使用了
boost
,并且自 我自己的代码也使用它,可能有冲突的版本和 这就是问题的根源

原始问题:

很多信息,但我试着把它归结为有趣的部分。我正在编写一个应用程序,它使用类的实例来执行各种任务。当我试图使用
new
关键字分配实例时,我遇到了麻烦。以下是问题的简化版本:

#include <ccmc/Kameleon.h>

int main() {
  ccmc::Kameleon k;
  ccmc::Kameleon *k2 = new ccmc::Kameleon(); // <-- crashes with this line
  delete k2:
  return 0;
 }
我尝试了错误消息、gdb和valgrind的问题,但似乎找不到问题的根源。这就是运行程序给我的:

FurnaceApp: malloc.c:2451: sYSMALLOc: Assertion `(old_top == (((mbinptr) (((char *) &((av)->bins[((1) - 1) * 2])) - __builtin_offsetof (struct malloc_chunk, fd)))) && old_size == 0) || ((unsigned long) (old_size) >= (unsigned long)((((__builtin_offsetof (struct malloc_chunk, fd_nextsize))+((2 * (sizeof(size_t))) - 1)) & ~((2 * (sizeof(size_t))) - 1))) && ((old_top)->size & 0x1) && ((unsigned long)old_end & pagemask) == 0)' failed.
Aborted (core dumped)
gdb告诉我以下几点:

// Kameleon.cpp
/*47*/ Kameleon::Kameleon() : model(NULL), // model is a non-const pointer 
/*48*/                        modelName("NA"), // modelName is a non-const std::string
/*49*/                        missingValue(0.f) // missingValue is a non-const float
/*50*/ {}
(gdb) bt
#0  0x00007ffff6b1c425 in __GI_raise (sig=<optimized out>) at ../nptl/sysdeps/unix/sysv/linux/raise.c:64
#1  0x00007ffff6b1fb8b in __GI_abort () at abort.c:91
#2  0x00007ffff6b6415d in __malloc_assert (assertion=<optimized out>, file=<optimized out>, line=<optimized out>, function=<optimized out>)
    at malloc.c:300
#3  0x00007ffff6b67664 in sYSMALLOc (av=0x7ffff6e9e720, nb=48) at malloc.c:2448
#4  _int_malloc (av=0x7ffff6e9e720, bytes=27) at malloc.c:3892
#5  0x00007ffff6b68fb5 in __GI___libc_malloc (bytes=27) at malloc.c:2924
#6  0x00007ffff746cded in operator new(unsigned long) () from /usr/lib/x86_64-linux-gnu/libstdc++.so.6
#7  0x00007ffff7455a89 in std::string::_Rep::_S_create(unsigned long, unsigned long, std::allocator<char> const&) ()
   from /usr/lib/x86_64-linux-gnu/libstdc++.so.6
#8  0x00007ffff7457495 in char* std::string::_S_construct<char const*>(char const*, char const*, std::allocator<char> const&, std::forward_iterator_tag) () from /usr/lib/x86_64-linux-gnu/libstdc++.so.6
#9  0x00007ffff74575e3 in std::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string(char const*, std::allocator<char> const&) () from /usr/lib/x86_64-linux-gnu/libstdc++.so.6
#10 0x00007ffff7757caf in ccmc::Kameleon::Kameleon (this=0x67d920) at Kameleon.cpp:49
#11 0x0000000000415516 in main ()
环顾四周,似乎这些错误通常是在不正确地使用
malloc
和在分配的内存之外写入时出现的。在
Kameleon
类中有很多代码,但由于我自己没有编写,因此我在尝试跟踪它时遇到了问题。任何寻找虫子的小贴士都将不胜感激

你能试试吗:

Kameleon::Kameleon(): model(NULL), modelName("N/A") {
    // ...
}
modelName
const是否有可能

您还可以删除
CDFReader
的构造函数中的所有未清除的代码来隔离bug吗?或者更好:

#include "Kameleon.h" // or whatever

int main(){
    ccmc::Kameleon k;
    ccmc::Kameleon *k2 = new ccmc::Kameleon();
    delete k2;
}
Kameleon
是派生类吗?它是否使新的
操作符过载

==11789== Invalid write of size 8
==11789==    at 0x52ECC8D: ccmc::Kameleon::Kameleon() (buckets.hpp:128)
==11789==    by 0x415515: main (in /home/vsand/OpenSpace/Furnace/FurnaceApp)
==11789==  Address 0x6683a00 is 0 bytes after a block of size 464 alloc'd
==11789==    at 0x4C2B1C7: operator new(unsigned long) (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==11789==    by 0x41550A: main (in /home/vsand/OpenSpace/Furnace/FurnaceApp)
这意味着:

  • 分配
    ccmc::Kameleon
    实例的代码认为
    sizeof(ccmc::Kameleon)
    是464,而
  • 您的代码实际实现了
    ccmc::Kameleon::Kameleon()
    写入字节
    [此+464,此+472)
最可能的原因是:

  • 您已经在
    bucket.hpp
    中更改了类的定义,并且
  • 您没有重新编译使用它的所有代码,因此违反了
您必须重新生成使用Kameleon的所有代码,一旦重新生成,您的问题就会消失

buckets.hpp来自增压集管

另一种可能是,您正在链接一个针对不同版本的Boost编译的库。这是行不通的,您必须使用完全相同的Boost版本


最后一种可能性是,Boost使用一组不一致的
-DXX
标志进行编译,导致
Kameleon
类的定义不同(并且再次违反了一个定义规则).

我会冒险猜测缺陷在
//其他初始化中
@john:我从代码中删除了不必要的部分并更新了问题。谢谢,我彻底检查了问题并修改了构造函数。它仍然崩溃,但错误消息略有不同!@VictorSand:哪个调用失败?两个都失败?试着对第二个进行注释.这个类是否重载了
new
操作符?当运行'ccmc::Kameleon k'时,我没有得到相同的错误。我可以在创建变量后立即使用它。但是,当main()返回,我得到一个无法跟踪的segfault。我检查了Kameleon析构函数,那里似乎没有什么奇怪的地方。这可能与使用new时的问题有关吗?它不是派生的,它不会重载新运算符。等等,现在你说错误在程序终止期间?这根本不是同一个问题。你能成功创建对象吗在这两种情况下都成功了吗?谢谢,我同意。看起来buckets.hpp和table.hpp都有错误(还有更多类似错误的文件)来自boost标题。我自己在评论boost之后看到了您关于boost的更新。经过进一步挖掘,Kameleon似乎确实使用了boost,这可能就是问题的根源。我将接受这个答案并尝试解决boost冲突!
==11789== Invalid write of size 8
==11789==    at 0x52ECC8D: ccmc::Kameleon::Kameleon() (buckets.hpp:128)
==11789==    by 0x415515: main (in /home/vsand/OpenSpace/Furnace/FurnaceApp)
==11789==  Address 0x6683a00 is 0 bytes after a block of size 464 alloc'd
==11789==    at 0x4C2B1C7: operator new(unsigned long) (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==11789==    by 0x41550A: main (in /home/vsand/OpenSpace/Furnace/FurnaceApp)