sYSMALLOc 断言失败时"new"关键字
sYSMALLOc assertion failed when using "new" keyword
编辑:为了清楚起见,我将问题保留原样问题似乎是
Kameleon
类使用boost
,并且由于我自己的代码也使用它——可能有冲突的版本和这就是问题的根源。
原始问题:
有很多信息,但我试着把它归结为有趣的部分。我正在编写一个应用程序,它使用类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((程序会返回segfoots。析构函数什么也不做。
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来自提升标头
另一种可能性是,您正在链接一个针对不同版本的Boost编译的库。不能工作,必须使用完全相同版本的Boost。
最后一种可能性是,Boost是用一组不一致的-DXX
标志编译的,这导致了Kameleon
类的不同定义(并且再次违反了一个定义规则(。
你能试试吗:
Kameleon::Kameleon(): model(NULL), modelName("N/A") {
// ...
}
modelName
是常数吗?
你还可以删除CDFReader
构造函数中的所有非断言代码来隔离bug吗?甚至更好:
#include "Kameleon.h" // or whatever
int main(){
ccmc::Kameleon k;
ccmc::Kameleon *k2 = new ccmc::Kameleon();
delete k2;
}
Kameleon
是派生类吗?它是否使new
运算符过载?
- 声明C++数组(带或不带 "new" 关键字)
- 在 Objective-C++ -> EXC_BAD_ACCESS Error 中使用"new"关键字
- 如何在堆上初始化线程?(使用 "new" 关键字)
- 如何在不使用 "new" 关键字的情况下解除分配创建的对象的内存?
- 在 new 关键字中,由默认构造函数初始化的类中的元素是否也使用 new 关键字在C++?
- 野牛解析器无法识别"New"关键字
- 'new'关键字如何工作?我最近才知道新关键字
- 为什么当我使用"new"关键字声明数组指针时无法删除它
- 如果我不使用 new 关键字,可能会出现内存泄漏吗?
- 'new'关键字和类存储
- 说明何时在C++中使用 "new" 关键字
- 在没有“new”关键字的情况下实例化类会导致在堆栈或堆上创建其内部变量
- C++对象初始化,无需 new 关键字并使用指针
- 当对象不使用 new 关键字但父对象在堆中时,对象是否存储在堆栈或堆中
- 在没有 new 关键字的情况下初始化C++对象的内存从何而来
- 模板类的构造函数在使用 new 关键字时调用类型构造函数
- 循环中的多个对象C++而不"new"关键字
- C++:结构和new关键字
- 删除c++中的对象,以及new关键字
- New关键字用作标识符