分段错误(核心已转储)- 二维数组

Segmentation fault (core dumped) - Two dimensional array

我对这段代码有疑问:

1) Segmentation fault in cpp object.

相同的代码适用于 main 函数。

// Create
vector< vector<int> > vec(4, vector<int>(4));
// Write
vec[2][3] = 10;
// Read
int a = vec[2][3];

我创建了一个二维数组元素。内存分配有问题。不知道怎么处理。

#include <iostream>
#include <vector>    
using namespace std;

class Matrix
{
public:
    int m, n;
    Matrix();
    Matrix(int, int);
    vector<vector<int> > vec;
};

int main()
{
    Matrix obj(3, 4);
    obj.vec[1][2] = 33;
    return 0;
}

Matrix::Matrix()
{
    n = 0;
    m = 0;
    vector< vector<int> > vec(m, vector<int>(n));
}

Matrix::Matrix(int m, int n)
{
    this->m = m;
    this->n = n;
    vector< vector<int> > vec(m, vector<int>(n));
}

您没有分配 Matrix class 的 vec 成员,而是在 Matrix 的构造函数中引入了局部 std::vector<std::vector<int>> vec ,它只有构造函数中的生命周期。

您应该 std::vector::resize 使用 mn 传递给成员 vec

Matrix::Matrix(int m, int n)
{
    this->m = m;
    this->n = n;
    vec.resize(m, std::vector<int>(n));
}

或使用constructor member initializer lists初始化vec.

Matrix::Matrix(int m, int n)
    : m{ m }
    , n{ n }
    , vec(m, std::vector<int>(n))
{}

旁注:

  • 为成员和构造函数参数使用不同的名称,以避免混淆。

  • 不要用using namespace std;练习。

例如:

#include <vector>

class Matrix /* final */
{
    int mRow, mCol;
    std::vector<std::vector<int>> mStorage;

public:    
    Matrix(int m, int n)  // different name as the members
        : mRow{ m }
        , mCol{ n }
        , mStorage(mRow, std::vector<int>(mCol))
    {}
};