2013-04-22 76 views
0

編輯:爲了清楚起見,我會留下問題,因爲它是。 問題似乎是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類,但由於我沒有自己寫,我有問題試圖追查下來。任何錯誤狩獵技巧將不勝感激!

+0

我會冒險猜測這個錯誤是在'//其他初始化' – john 2013-04-22 20:47:53

+0

@john:我從代碼中刪除了不必要的部分並更新了問題。 – 2013-04-22 21:15:58

回答

1
==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,並且
  • 你沒有重新編譯使用它的所有代碼,從而違反了one definition rule

必須重建所有它採用Kameleon,一旦你這樣做,你的問題就會迎刃而解的代碼。

buckets.hpp是從boost頭

另一種可能是你與反對不同版本的Boost編譯庫鏈接。那不能工作,你使用完全相同版本的Boost。

最後的可能性是,Boost編譯的標記爲-DXX不一致,導致Kameleon類的不同定義(並且違反了一個定義規則)。

+0

謝謝,我在上面。看起來像buckets.hpp和table.hpp(以及更多像這樣的錯誤的文件)來自boost頭文件。 – 2013-04-23 14:34:01

+0

剛剛對自己進行評論後,查看了關於boost的更新。經過更多的挖掘,看起來Kameleon確實使用了提升,這可能是麻煩來自的地方。我會接受這個答案,並試圖解決助推衝突! – 2013-04-23 15:10:45

1

你可以嘗試:

Kameleon::Kameleon(): model(NULL), modelName("N/A") { 
    // ... 
} 

modelName const的任何機會?

你也可以刪除構造函數CDFReader中的所有uncesseray代碼來隔離錯誤嗎?或者更好:

#include "Kameleon.h" // or whatever 

int main(){ 
    ccmc::Kameleon k; 
    ccmc::Kameleon *k2 = new ccmc::Kameleon(); 
    delete k2; 
} 

Kameleon是派生類嗎?它是否超載new運營商?

+0

謝謝,我修改了這個問題並修改了構造函數。它仍然崩潰,但具有稍微不同的錯誤消息! – 2013-04-22 21:15:10

+0

@VictorSand:哪個呼叫失敗?都?嘗試評論第二個。這個類是否超載'new'運算符? – Thibaut 2013-04-22 21:17:21

+0

當只運行'ccmc :: Kameleon k'時,我不會得到相同的錯誤。我可以在創建它之後使用該變量。但是,當main()返回時,我得到了一個我無法跟蹤的段錯誤。我檢查了Kameleon析構函數,在那裏沒有什麼奇怪的。這可能與使用新的問題有關嗎? – 2013-04-22 21:27:52