C++ 分段故障(堆芯转储)-二维阵列

C++ 分段故障(堆芯转储)-二维阵列,c++,arrays,class,constructor,stdvector,C++,Arrays,Class,Constructor,Stdvector,我对此代码有问题: 在主函数上使用相同的代码 // 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

我对此代码有问题:

在主函数上使用相同的代码

// 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));
}

您没有分配矩阵类的vec成员,而是在矩阵的构造函数中引入了一个本地std::vector vec,它在构造函数中只有生存期

您应该使用传递的m和n对成员vec进行初始化

作为旁注:

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

不要和我一起练习

例如:

#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))
    {}
};

您没有分配矩阵类的vec成员,而是在矩阵的构造函数中引入了一个本地std::vector vec,它在构造函数中只有生存期

您应该使用传递的m和n对成员vec进行初始化

作为旁注:

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

不要和我一起练习

例如:

#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))
    {}
};

我对没有参数的构造函数有问题。分段错误@JeJo'Matrix::Matrix{n=0;m=0;vec.resizem,vectrain;}'@Mouse在那里您也有与其他构造函数相同的问题,但这不会影响程序。由于m和n为0,所以vec的大小也将为0,因此通过std::vector::operator[]访问元素是不受限制的,因此,您不应该这样做!我对没有参数的构造函数有问题。分段错误@JeJo'Matrix::Matrix{n=0;m=0;vec.resizem,vectrain;}'@Mouse在那里您也有与其他构造函数相同的问题,但这不会影响程序。由于m和n为0,所以vec的大小也将为0,因此通过std::vector::operator[]访问元素是不受限制的,因此,您不应该这样做!
Matrix::Matrix(int m, int n)
    : m{ m }
    , n{ n }
    , vec(m, std::vector<int>(n))
{}
#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))
    {}
};