2011-05-07 60 views
1

我正在編寫一個通過套接字與服務器應用程序通信的客戶端應用程序。我目前正在經歷奇怪的行爲,應用程序完成正常運行,但後來我得到了很多行,如下所示。程序退出時出現C++內存錯誤

*** glibc detected *** ./sll_client: free(): invalid next size (fast): 0x0000000000787720 *** 
======= Backtrace: ========= 
/lib/x86_64-linux-gnu/libc.so.6(+0x78a8f)[0x7f9e9cbb5a8f] 
/lib/x86_64-linux-gnu/libc.so.6(cfree+0x73)[0x7f9e9cbb98e3] 
/usr/lib/x86_64-linux-gnu/libstdc++.so.6(_ZNSsD1Ev+0x39)[0x7f9e9d409019] 

======= Memory map: ======== 

7f9e9d893000-7f9e9d895000 rw-p 00021000 07:00 7473      /lib/x86_64-linux- gnu/ld-2.13.so 
7fff68119000-7fff6813a000 rw-p 00000000 00:00 0       [stack] 
7fff68167000-7fff68168000 r-xp 00000000 00:00 0       [vdso] 
ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0     [vsyscall] 
Aborted 

具體的「glibc」錯誤幾乎每次都不同。

我已經通過Valgrind運行應用程序,並且幾乎沒有檢測到內存泄漏。那些在那裏似乎沒有造成任何問題。是否有這個問題的一般原因?我可以發佈一些代碼,但它超過三千行C++,這是三個星期以來第一次出現這個問題。

Valgrind Output

GDB Output

+1

valgrind是否報告除內存泄漏之外的任何其他問題? – 2011-05-07 03:28:06

+0

我會說它已經完成正常運行......現在顯然運行不正常。 – 2011-05-07 03:33:49

+0

@Fred:我已經添加了Valgrind的日誌鏈接 – XBigTK13X 2011-05-07 03:38:27

回答

4

大小爲4的無效寫入幾乎肯定是什麼導致你的問題。你正在跺腳你不擁有的內存,很可能就在動態分配的內存區域之前或之後。

大小4的無效讀取也是有問題的,但不會導致您得到的輸出。無論如何修復它們。 :-)

內存錯誤可能是一個巨大的痛苦,因爲它們的影響可以顯示出問題的真正來源。這是Valgrind等工具的一部分。內存泄漏檢測實際上是一個小功能。

+0

這些錯誤指向我打電話給std :: swap的地方。它被稱爲一個人口稠密的向量,指數是有效的。爲什麼會導致問題? – XBigTK13X 2011-05-07 03:58:11

+0

@ XBigTK12X:這很奇怪。我不知道爲什麼會這樣。被交換的值是否有自己的拷貝構造函數和/或賦值操作符? – Omnifarious 2011-05-07 04:13:58

+0

正在std :: vector 中的兩個元素上調用交換。 – XBigTK13X 2011-05-07 04:17:52

1

您是否追蹤過持續發生在您的valgrind日誌中的Invalid read of size 4消息的根本原因?
那些無效的讀取是您的問題的根本原因。

+0

當我在向量中的兩個元素上調用std :: swap時發生這種情況。任何想法爲什麼這可能會導致問題? – XBigTK13X 2011-05-07 04:09:04