Как бороться с SIGSEGV в C ++ - PullRequest
0 голосов
/ 07 мая 2020

Вот забавное 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;
}

1 Ответ

1 голос
/ 07 мая 2020

trans возвращает ссылку на объект в стеке, который удаляется при возврате trans. Это неопределенное поведение. Вы должны вернуть значение, а не ссылку. Таким образом, единственное изменение - в сигнатуре функции.

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

Кстати, если вы ожидаете, что матрица никогда не будет nullptr, вам следует подумать о том, чтобы сделать ее ссылкой (сравните CppCoreGuidelines ).

...