如何在 C++ 中处理 SIGSEGV

How to deal with SIGSEGV in C++

这是一个用于(我猜)转置矩阵的函数,作为向量复制构造函数的参数:

vector<vector<double>> tB(trans(B));

我这里有段错误:

vector<vector<double>>& trans(vector<vector<double>>* matrix)
{
    vector<vector<double>> result(matrix->size(), vector<double>(matrix->size(), 0.0)); <-- HERE   

    for (int i = 0; i < matrix->size(); ++i) {
        for (int j = 0; j < matrix->size(); ++j) {
            result.at(i).at(j) += matrix->at(j).at(i);
        }
    }

    return result;
}

没关系,即使我这样做:

vector<vector<double>>& trans(vector<vector<double>>* matrix)
{
    vector<vector<double>> result; <-- AGAIN SIGSEGV ERROR 

    for (int i = 0; i < matrix->size(); ++i) {
        vector.push_back(vector<double>(matrix->size(), 0.0));
        for (int j = 0; j < matrix->size(); ++j) {
            result.at(i).at(j) += matrix->at(j).at(i);
        }
    }

    return result;
}

trans returns 对堆栈中对象的引用,当 trans returns 时删除。这是未定义的行为。您应该 return 一个值,而不是一个引用。所以唯一的变化是函数签名。

vector<vector<double>> trans(vector<vector<double>>* matrix)

顺便说一句,如果您希望矩阵永远不会是 nullptr,您应该考虑将其作为参考(比较 CppCoreGuidelines)。