2013-03-07 198 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

只是考虑,我最好的猜测是,你正在尝试使用无效的源数据创建一个字符串,可能多数民众赞成未初始化或者某个指向一个已经被释放的字符串中的字符指针