2013-03-07 203 views
-1

我正在開發基於Skyline查詢的算法,使用C++,使用RTree存儲我的數據。該算法工作正常,如果我處理多達5點,然後如果我嘗試6點,它給出了分段錯誤。 用GDB我發現這個問題是在這裏:std :: string函數中的C++分段錯誤

Program received signal SIGSEGV, Segmentation fault. 
std::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string (
    this=0x7fffffffd7c0, __str= 
    <error reading variable: Cannot access memory at address 0xffffffffffffffe8>) 
    at /usr/src/debug/gcc-4.7.2-20120921/obj-x86_64-redhat-linux/x86_64-redhat-linux/libstdc++-v3/include/bits/basic_string.tcc:175 
175   __str.get_allocator()) 

任何人可以幫助我理解錯誤所在或AR

+4

你有一個bug你的代碼。如果您想要更具體的答案,請發佈相關代碼。 – 2013-03-07 03:49:02

+0

米奇的代碼是相當長的後,更多的是我的最後一年的項目的一部分,我的大學可能會認爲這是作弊。無論如何,我可以發佈也許它的一部分 – luigi 2013-03-07 03:51:31

+4

嘗試使用Valgrind .... – 2013-03-07 03:52:32

回答

1

米奇小麥已經建議這一條評論,但我認爲這是在事實上你的問題的最佳答案,所以:

使用valgrind。

Valgrind是一種工具(或更確切地說是一組工具),其默認操作模式是運行程序並檢查內存錯誤,如泄漏,緩衝區溢出,未初始化的讀取等。

從字面上看,您需要做的就是構建您的程序,最好使用-g選項使其更容易調試,然後像valgrind my-prog args...那樣運行它。 Valgrind隨後會在出現問題時打印出詳細的堆棧跟蹤報告。你的問題可能會在沒有需要使用常規調試器的情況下發現,也不會讓我們猜測問題(如果這是我自己的問題,我也會使用valgrind)。

+1

「*所有你需要做的就是構建你的程序*」你還必須在Linux(或MacOSX)上運行它。這並不總是你能做的事情。 – 2013-03-07 04:06:19

+0

@NicolBolas:確實如此,但OP正在使用'GDB'。我會說這是一個安全的賭注,這個代碼運行在* nix OS下。 – 2013-03-07 04:08:40

+0

@EdS。自從MinGW與GDB合作以後,並不是真的。 – Rapptz 2013-03-07 04:10:37

1

只是考慮,我最好的猜測是,你正在嘗試使用無效的源數據創建一個字符串,可能多數民衆贊成未初始化或者某個指向一個已經被釋放的字符串中的字符指針