分段故障 运行C++代码时出现 SIGSEGV

Segmentation Fault SIGSEGV while running C++ code

本文关键字:SIGSEGV 代码 故障 运行 C++ 分段      更新时间:2023-10-16

我在执行C++代码时出错

错误是: 劣级停止,因为它从操作系统接收到信号。

信号名称:SIGSEGV 信号含义:分段故障

IDE:QT创建者

我知道我在头文件中声明 2 个结构数组的方式有问题 但不知道到底是什么!

有人可以解释一下吗..

请注意,我计划以递归或迭代的方式创建多个 Datamatrix 类实例作为我工作的一部分。 每个实例包含二维结构数组。 因此,欢迎任何帮助解释。 有很多C++领域我没有探索过!还在学习:)

请参阅下面的代码

主.cpp ----------

#include <iostream>
#include "datamatrix.h"
#include "utils.h"
using namespace std;
void printArray(int items[],int size)
{
for(int j=0;j<size;j++)
{
cout<<items[j]<<" ";
}
cout<<endl;
}
int main()
{
cout << "Hello there" << endl;
int a[250];
for(int i=0;i<250;i++)
{
a[i] = i+1;
}
printArray(a,250);
DataMatrix *matrix = new DataMatrix();
Utils u;
u.myFunction(matrix); **<-- All goes well till here**
cout<<"End of Main method"; **<-- This line of code is never reached**
return 0;
}

数据矩阵.h ------------

#ifndef DATAMATRIX_H
#define DATAMATRIX_H
#include <string>
using namespace std;
struct KVPair { **<--- This is the line where issue comes**
string key;
double value;
};
class DataMatrix
{
public:
DataMatrix();
KVPair matrix[250][130];
};
#endif // DATAMATRIX_H

数据矩阵.cpp --------------

#include "datamatrix.h"
DataMatrix::DataMatrix()
{
for(int i=0;i<250;i++)
{
for(int j=0;j<130;j++)
{
string k = "f"+i+1;
matrix[i][j].key = k;
matrix[i][j].value = i+5;
}
}
}

实用性.h --------

#ifndef UTILS_H
#define UTILS_H
#include "datamatrix.h"
class Utils
{
public:
Utils();
DataMatrix myFunction(DataMatrix* dm);
};
#endif // UTILS_H

实用工具.cpp ---------

#include "utils.h"
#include <algorithm>
#include <time.h>
#include <math.h>
#include "datamatrix.h"
Utils::Utils()
{
}
DataMatrix Utils::myFunction(DataMatrix* dm)
{
printf("inside myFunction ");
}

只是想添加控制台输出(请参阅下面的控制台输出(

嗨,你好 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 5 7 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 在我函数内

提前致谢

以下行:

string k = "f"+i+1;

导致问题。它获取的地址远远超出字符串文字"f",这是一个无效的地址,并将其传递给构造函数std::string构造函数,构造函数从该地址读取以确定字符串的长度并导致崩溃。


一种解决方法是:

string k = "f" + std::to_string(i + 1);

gcc -Wall中删除一个警告可以防止崩溃。一种方法是在Utils::myFunction中添加返回值,如下所示。

DataMatrix Utils::myFunction(DataMatrix* dm)
{   
printf("inside myFunction ");
return *dm;
}

似乎main为堆栈上的DataMatrix分配空间,期望对Utils::myFunction的调用将填充该空间。以下gdb会话摘录中二进制文件,其中添加了return语句,Utils::myFunction强化了这一说法。

(gdb) break main.cpp:30
Breakpoint 1 at 0xfaa: file main.cpp, line 30.
(gdb) run > /dev/null
Starting program: main > /dev/null
Breakpoint 1, main () at main.cpp:30
30      u.myFunction(matrix);
(gdb) print matrix
$1 = (DataMatrix *) 0x7ffff7e95010
(gdb) set $matrix = (DataMatrix *) ($rbp - 0x13d640)
(gdb) print matrix.matrix[249][129].key
$2 = "30J17vwb200"
(gdb) print $matrix.matrix[249][129].key
$3 = <incomplete sequence 303>
(gdb) next
31      cout<<"End of Main method";
(gdb) print $matrix.matrix[249][129].key
$4 = "30J17vwb200"
(gdb) 

在我的测试中,崩溃发生在尝试释放由任意堆栈内容组成的未初始化KVPair期间。前面的gdb会话摘录中没有透露其详细信息,但重点是在Utils::myFunction返回void以外的值后,DataMatrix的两个副本就最后一个数组元素的内容达成一致(在我的测试中,析构函数中处理的第一个(。以下摘自gdb反汇编解释了用于$matrix$rbp偏移量。

0x0000555555554fc7 <+183>:       lea    -0x13d640(%rbp),%rax
0x0000555555554fce <+190>:       mov    %rax,%rdi
0x0000555555554fd1 <+193>:       callq  0x555555555092 <DataMatrix::~DataMatrix()>

防止崩溃的另一种方法是将Utils::myFunction声明为返回void,在这种情况下,main不会在堆栈上分配空间,并且在main中没有调用DataMatrix析构函数。