在建立二维矩阵时避免分割错误

Avoid a segmentation fault when setting up a 2D matrix

本文关键字:错误 分割 二维 建立      更新时间:2023-10-16

我有一个类,它存储了一个从通用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[],并且指针数学将再次与世界正确。