c++ - 分段故障(核心已转储)-二维数组

标签 c++ arrays class constructor stdvector

我对此代码有疑问:

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

最佳答案

您尚未分配vec类的Matrix成员,而是在std::vector<std::vector<int>> vec的构造函数中引入了本地Matrix,该构造函数内部只有生命周期。

您应该使用传递的std::vector::resizevecm成员化为 n

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

    关于c++ - 分段故障(核心已转储)-二维数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59521429/

    相关文章:

    python - python类中的简单线程管理

    c++ - 通过 D2XX 库或 OPENCV 捕获相机(USB)

    c++ - 解析 SVG 变换属性的变换列表

    c++ - win32 的 mkstemp() 实现

    java - 如何使用二进制数组 WebSocket 创建 TargetDataLine?

    c++ - 我想将这个 char 数组中的每个元素保存到一个单独的数组中

    Java 8 - 在 Arrays.asList 和 Stream.of 之间的一行差异中初始化列表

    java - 将代码移动到另一个类会导致应用程序崩溃

    java - msgpack:C++ 和 java 之间的消息传递

    java拆分每个字母并将其放入表中