如何在 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)。
这是一个用于(我猜)转置矩阵的函数,作为向量复制构造函数的参数:
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)。