我遇到了一个奇怪的段错误。我已粘贴下面代码的相关部分。
当我在gdb中运行代码时,我得到以下输出:
DERPE
DERPH0 1
Program received signal EXC_BAD_ACCESS, Could not access memory.
Reason: KERN_PROTECTION_FAILURE at address: 0x00007fff5f3ffff0
0x000000010000fcee in Interval::contains (this=0x100103c90, other={isValid = 93, s = 1, e = 7, n = 5}) at interval.cpp:33
33 if (!contains(other.s)) {
A.cpp
void A::foo(){
...
std::cout << "DERPE" << std::endl;
std::cout << "DERPH" << id << " " << curr << std::endl;
\\graph is a vector<B>
std::cout << "DERPI" << id << " " << curr << " " << graph[id].bar(graph[curr]) << std::endl;
...
}
B.cpp
bool B::bar(B &other) const {
// each B contains 2 Intervals, adj, opp
return (other.adj.contains(this->adj) and
(!this->opp.isValid or other.adj.contains(this->opp) or
(other.opp.isValid and other.opp.contains(this->opp))));
}
Interval.cpp
bool Interval::contains(Interval other) const {
if (!contains(other.s)) {
return false;
}
...
}
当我尝试使用gdb时,我得到以下内容:
(gdb) p other
$1 = {
isValid = 93,
s = 1,
e = 7,
n = 5
}
(gdb) p this
$2 = (const Interval *) 0x100103c90
(gdb) p *this
$3 = {
isValid = 93,
s = 1,
e = 0,
n = 5
}
(gdb) p other.s
$4 = 1
(gdb) p (*this).contains(other.s)
Program received signal EXC_BAD_ACCESS, Could not access memory.
Reason: KERN_PROTECTION_FAILURE at address: 0x00007fff5f3fff50
Interval::contains (this=Cannot access memory at address 0x7fff5f3fff50
) at interval.cpp:28
28 bool Interval::contains(int x) const {
The program being debugged was signaled while in a function called from GDB.
GDB remains in the frame where the signal was received.
To change this behavior use "set unwindonsignal on"
Evaluation of the expression containing the function (Interval::contains(int) const) will be abandoned.
(gdb) p this
Cannot access memory at address 0x7fff5f3fff50
有关如何处理此问题的任何想法?我输了。
编辑: Interval的完整头文件如下:
Interval.h
#ifndef INTERVAL_H
#define INTERVAL_H
#include <vector>
struct Interval {
bool isValid;
int s, e, n;
Interval() {};
Interval(int n);
Interval(int start, int end, int n);
bool operator==(const Interval other) const;
int length() const;
bool contains(int x) const;
bool contains(Interval other) const;
};
#endif
我没有复制构造函数,但我认为一切都只是基元,所以默认的复制构造函数可以工作。
我更多地玩了它,这看起来很相似:
(gdb) backtrace 10
#0 0x000000010000fcce in Interval::contains (this=0x100103c90, other={isValid = 34, s = 1, e = 6, n = 5}) at interval.cpp:33
#1 0x000000010000fd9b in Interval::contains (this=0x100103c90, other={isValid = 34, s = 1, e = 6, n = 5}) at interval.cpp:52
#2 0x000000010000fd9b in Interval::contains (this=0x100103c90, other={isValid = 34, s = 1, e = 6, n = 5}) at interval.cpp:52
#3 0x000000010000fd9b in Interval::contains (this=0x100103c90, other={isValid = 34, s = 1, e = 6, n = 5}) at interval.cpp:52
#4 0x000000010000fd9b in Interval::contains (this=0x100103c90, other={isValid = 34, s = 1, e = 6, n = 5}) at interval.cpp:52
#5 0x000000010000fd9b in Interval::contains (this=0x100103c90, other={isValid = 34, s = 1, e = 6, n = 5}) at interval.cpp:52
#6 0x000000010000fd9b in Interval::contains (this=0x100103c90, other={isValid = 34, s = 1, e = 6, n = 5}) at interval.cpp:52
#7 0x000000010000fd9b in Interval::contains (this=0x100103c90, other={isValid = 34, s = 1, e = 6, n = 5}) at interval.cpp:52
#8 0x000000010000fd9b in Interval::contains (this=0x100103c90, other={isValid = 34, s = 1, e = 6, n = 5}) at interval.cpp:52
#9 0x000000010000fd9b in Interval::contains (this=0x100103c90, other={isValid = 34, s = 1, e = 6, n = 5}) at interval.cpp:52
(gdb) backtrace
#0 0x000000010000fcce in Interval::contains (this=0x100103c90, other={isValid = 34, s = 1, e = 6, n = 5}) at interval.cpp:33
...
#67667 0x000000010000fd9b in Interval::contains (this=0x100103c90, other={isValid = 34, s = 1, e = 6, n = 5}) at interval.cpp:52
(gdb)
答案 0 :(得分:1)
我明白了。无限回溯意味着包含中的递归没有得到正确处理(我错过了一个基本情况),所以它无限递归 - &gt;堆栈溢出 - &gt; seg fault。