SageCat
SageCat

Reputation: 335

How to deal with SIGSEGV in C++

Here is a func for (i guess) transposing matrix executed, as an arg of a vector copy-constructor:

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

I have a segmention fault here:

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

Doesn't matter, even if i do this:

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

Upvotes: 0

Views: 63

Answers (1)

Werner Henze
Werner Henze

Reputation: 16726

trans returns a reference to an object on the stack, which is deleted when trans returns. This is undefined behaviour. You should return a value, not a reference. So the only change is in the function signature.

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

BTW, if you expect matrix to never be nullptr, you should consider making it a reference (compare CppCoreGuidelines).

Upvotes: 1

Related Questions