在建立二维矩阵时避免分割错误
Avoid a segmentation fault when setting up a 2D matrix
我有一个类,它存储了一个从通用ListAsArray类继承的向量,但是当我尝试创建一个由这些向量类组成的矩阵时,我得到了一个分割错误。我的问题的一般例子如下:
#include <iostream>
#include <vector>
using namespace std;
class ListAsArray
{
public:
virtual void addToEnd(int i) = 0;
virtual int operator[](int i) = 0;
};
class ListAsVector : public ListAsArray
{
public:
void addToEnd(int i)
{
vec.push_back(i);
}
int operator[](int i)
{
return vec[i];
}
private:
vector<int> vec;
};
class FixedSizeMatrix
{
public:
FixedSizeMatrix(int rows, int columns)
{
int count = 0;
this->rows = rows;
this->columns = columns;
matrix = new ListAsVector[rows];
for (int i = 0; i < rows; ++i)
{
for (int j = 0; j < columns; ++j)
{
matrix[i].addToEnd(count++);
}
}
}
ListAsArray& operator[](int i)
{
return matrix[i];
}
private:
ListAsArray* matrix;
int rows;
int columns;
};
int main() {
FixedSizeMatrix m(1,2);
cout<<m[0][0]<<endl;
return 0;
}
这个问题只发生在我尝试创建一个多于一行的矩阵时。当我将矩阵的类型从ListAsArray*更改为ListAsVector*时,问题就消失了,所以需要进行某种类型转换,但我几乎尝试了所有方法,都没有成功。
因为这是一个赋值,所以我必须使用ListAsArray*类型的矩阵。
提前感谢您的任何帮助。
你正在切片你的对象。当分配ListAsVector
的数组时,每个对象都包含该std::vector<>
成员。但是,您使用ListAsArray*
来访问序列。因此,i
大于0的matrix[i]
对指针类型ListAsArray*
执行常规指针算术(这非常小,因为它没有成员,但确实包含一个虚函数表)。
只需将matrix
的类型更改为ListAsVector*
。(最好使用智能指针,或者直接使用std::vector<ListAsVector>
)。ListAsArray
引用将仍然适用于operator[]
,并且指针数学将再次与世界正确。
相关文章:
- C++映射分割错误(核心转储)
- 由cin中的字符串中未捕获空白引起的分割错误
- 删除映射和分割错误中的一个过去结束元素
- 在指向函数中读取变量时出现分割错误
- 在链表中的第 n 位插入显示分割错误
- 较高值 n 的分割错误(例如 n=999997)
- 尝试通过memcpy复制大尺寸浮点向量时的分割错误
- 分割错误:向量中的擦除功能
- 向量向量的分割错误
- 我在C++中编写了一个方法来打印树类的预序,但它显示了分割错误
- C ++分割错误,为什么使用"long long"我没有得到答案?
- 在尝试使用递归查找集合子集的总数时,我遇到了分割错误
- 分割错误 11:尝试使用 cin 输入 B[1] 时
- 集合布局上的 Qt 分割错误
- 高达20亿的筛子会产生分割错误
- G :内部编译器错误:分割故障(程序CC1PLUS) - 我在哪里开始
- 二进制搜索树操作程序错误:分割故障(核心倾倒)
- 在给出正确的输出后,给出错误分割错误(核心转储)
- 得到错误分割错误(核心转储)进程返回139 (0x8B)
- 内部编译错误:分割错误在gcc.发送可变模板到struct时