【问题标题】:Avoid a segmentation fault when setting up a 2D matrix设置二维矩阵时避免分段错误
【发布时间】:2017-02-07 10:38:13
【问题描述】:

我有一个类,它存储一个从通用 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* 类型的矩阵。

提前感谢您的帮助。

【问题讨论】:

  • 你是 slicing 你的对象序列。matrix[i] 表示为 ListAsArray object,而不是指向某个 ListAsVector 对象的引用或指针。因此,只有第一个位于适当的边界上。
  • @WhozCraig 那么我该如何解决这个问题?
  • @WhozCraig 如果我将其更改为 ListAsArray** 矩阵;并将初始化更改为 matrix = new ListAsVector*[rows];我收到一条错误消息:从 'ListAsVector**' 到 'ListAsArray**' 的无效转换
  • 除非有人在我之前写,否则我会写出来。

标签: c++ inheritance matrix casting polymorphism


【解决方案1】:

你正在切割你的对象。当您分配ListAsVector 的数组时,每个对象都包含该std::vector&lt;&gt; 成员。但是,您使用ListAsArray* 来访问序列。因此,matrix[i] 其中i 大于零对指针类型ListAsArray* 执行常规指针运算(这非常小,因为它没有成员,但确实包含一个vtable)。

只需将matrix 的类型更改为ListAsVector*。 (更好的是,使用智能指针,或者只使用std::vector&lt;ListAsVector&gt;)。 ListAsArray 引用仍然适用于 operator[],指针数学将再次适用于世界。

【讨论】:

  • 好的,我会这样做的,非常感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多