編輯:爲了清楚起見,我會留下問題,因爲它是。 問題似乎是
Kameleon
類使用boost
,並且由於我自己的代碼也使用它,可能有衝突的版本和 這是問題的來源。使用「新」關鍵字sYSMALLOc斷言失敗
原題:
地塊的信息,但我已經試過熬下來的有趣的部分。我正在編寫一個應用程序,使用類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;
}
邊注:註釋掉new
分配k2
,只運行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
不正確地寫入超出分配內存等。有很多c在Kameleon
類,但由於我沒有自己寫,我有問題試圖追查下來。任何錯誤狩獵技巧將不勝感激!
我會冒險猜測這個錯誤是在'//其他初始化' – john 2013-04-22 20:47:53
@john:我從代碼中刪除了不必要的部分並更新了問題。 – 2013-04-22 21:15:58