- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
EDIT: For clarity's sake, I'll leave the question as it is. The problem seems to be that the
Kameleon
class usesboost
, and since my own code also uses it there are probably conflicting versions and that's where the problems come from.
原始问题:
很多信息,但我已尝试将其归结为有趣的部分。我正在编写一个应用程序,它使用 Kameleon
类的实例(不是我自己编写的)来执行各种任务。当我尝试使用 new
关键字分配实例时,我遇到了麻烦。这是问题的缩小版本:
#include <ccmc/Kameleon.h>
int main() {
ccmc::Kameleon k;
ccmc::Kameleon *k2 = new ccmc::Kameleon(); // <-- crashes with this line
delete k2:
return 0;
}
旁注:注释掉 k2
的 new
分配并仅运行 ccmc::Kameleon k
有效,我可以使用变量.但是,当我尝试这样做时,当 main() 返回时程序会出现段错误。析构函数什么都不做。
`Kameleon 构造函数执行以下操作:
// 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 和 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 告诉我以下内容:
(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 ()
最后,valgrind 给了我很多输出,但是这部分看起来最像前面的错误:
==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)
==11789==
==11789== Invalid write of size 8
==11789== at 0x52ECC94: ccmc::Kameleon::Kameleon() (table.hpp:226)
==11789== by 0x415515: main (in /home/vsand/OpenSpace/Furnace/FurnaceApp)
==11789== Address 0x6683a28 is not stack'd, malloc'd or (recently) free'd
==11789==
==11789== Invalid write of size 8
==11789== at 0x52ECC9F: ccmc::Kameleon::Kameleon() (Kameleon.cpp:49)
==11789== by 0x415515: main (in /home/vsand/OpenSpace/Furnace/FurnaceApp)
==11789== Address 0x6683a30 is not stack'd, malloc'd or (recently) free'd
==11789==
环顾四周,这些错误似乎通常是在不正确地使用 malloc
和写入超出分配的内存等时出现的。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()
的代码写入字节 [this+464, this+472)
。最可能的原因:
buckets.hpp
中类的定义,并且您必须重建所有使用Kameleon
的代码,一旦您这样做,您的问题就会消失。
buckets.hpp is from boost headers
另一种可能性是您正在链接针对不同版本的 Boost 编译的库。那不能工作,您必须使用完全相同版本的 Boost。
最后一种可能性是 Boost 是用一组不一致的 -DXX
标志编译的,导致 Kameleon
类的不同定义(再次违反了一个定义规则).
关于c++ - 使用 "new"关键字时 sYSMALLOc 断言失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16156347/
我希望有人能帮助我理解我哪里出了问题。我正在实现一个程序来检查拼写正确性。在此过程中,我使用 trie 数据结构将字典文本文件加载到内存中以检查单词。 总体而言,它似乎按预期运行,但在加载尽可能长的单
我在运行 C 程序时遇到以下 sysmalloc 错误。 malloc.c:3096: sYSMALLOc: Assertion `(old_top == (((mbinptr) (((char *)
sysmalloc: Assertion `(old_top == initial_top (av) && old_size == 0) || ((unsigned long) (old_size)
我编写了一个代码来将新成员添加到列表中。当我添加两个成员时它工作正常。但是,一旦我添加第三个并编译并运行代码,就会出现错误。代码及错误如下: #include #include struct list
我已经为这个错误苦苦挣扎了一段时间,但我不知道出了什么问题。这是代码: //the code for the function that is being called //charset is a
我正在尝试编写一个函数,用于搜索模式的所有出现并返回文件中与该模式匹配的偏移量数组。我想使用 realloc 动态增长返回的数组,但出现 SYSMALLOC 断言错误。有时,如果我使用不同的搜索模式,
我在使用 opencv 时遇到 sysmalloc 错误。当我调试时,我发现错误发生在这里: sm = cv::Mat::zeros(h,w,img.type()); 其中h和w分别是img行和w列。
#include #include char* text1 = "This is a string."; char* text2 = "Yet another thing."; void copy
我的 C 程序出现以下消息错误: a.out: malloc.c:2369: sysmalloc: Assertion `(old_top == (((mbinptr)(((char *) &((av
下面的 C 代码在我的 mac OS X 环境中运行良好,但如果我尝试在 ubuntu 环境中运行此代码,每当我输入偶数个输入(例如“1 2”)时,我都会遇到 malloc 断言失败,但奇数输入“1
我在 C 程序上收到一条 SYSMALLOc 错误消息,我相信此错误消息与我使用过的 malloc 相关,而且我通过在 malloc 周围放置 printf 语句发现了这一点,并且它导致了问题。我看不
我正在运行这个 c++ 程序,它不断给我 sysmalloc assertion failed 错误。我正在使用 g++-4.8。 # include # include # include #
/* Dynamic Programming implementation of LCS problem */ #include #include #include #include using na
EDIT: For clarity's sake, I'll leave the question as it is. The problem seems to be that the Kameleo
我正在编写一个名为 Process 的非常简单的结构,乍一看代码似乎已正确实现,但在测试我的代码时,程序似乎一直在崩溃,无论是由于 sysMalloc 断言失败还是由于 double free() 错
我的服务器守护进程在大多数机器上运行良好,但在我得到的一台机器上: malloc.c:3074: sYSMALLOc: Assertion `(old_top == (((mbinptr) (((ch
我的函数如下: void Insert_ldb(int t){ struct node_ldb *temp_ldb1,*lastnode_ldb; temp_ldb1=root_ldb
我这辈子都搞不清楚到底发生了什么。这是我得到的错误: alloc static vecs a.out: malloc.c:2451: sYSMALLOc: Assertion `(old_top ==
我遇到了一个神秘的错误,我不知道为什么。这段代码在失败之前运行了几次,并且总是在同一点失败。 这是我的代码: assert(size > 0); int* sorted = mallo
对于学校作业,我需要跟踪 Product 类的多个实例。 在我的程序的主要部分,我正在制作一个 vector ,如下所示: std::vector> products; 在我的 main 中的特定条件
我是一名优秀的程序员,十分优秀!