分段错误,但数组对象未超出范围 (C++)
Segmentation fault but array object is not going out of bounds (C++)
还有其他
关于分段错误的常见原因的帖子,但我认为我在这里创建的内置数组对象(result
)在我为其赋值时不会越界。
我认为这可能会对将来拥有数组不越界的人有所帮助,而且我也没有看到很多关于制作 2D 内置数组对象的东西 - 我见过的例子几乎完全是向量或 std:array 对象。
以下是可运行的相关代码:
矩阵.h
#ifndef MATRIX_H
#define MATRIX_H
#include <initializer_list>
using std::initializer_list;
typedef unsigned int uint;
class Matrix {
public:
Matrix(uint rows, uint cols);
~Matrix();
Matrix add(double s) const;
const uint numRows() const;
const uint numCols() const;
double & at(uint row, uint col);
const double & at(uint row, uint col) const;
private:
uint rows, cols;
double ** matrix;
void makeArray() {
matrix = new double * [rows];
for(uint i = 0; i < rows; ++i) {
matrix[i] = new double [cols];
}
}
};
#endif
矩阵.cpp
#include "matrix.h"
Matrix::Matrix(uint rows, uint cols) {
//Make matrix of desired size
this->rows = rows;
this->cols = cols;
makeArray();
//Initialize all elements to 0
for(uint i = 0; i < rows; ++i) {
for(uint j = 0; j < cols; ++j) {
this->matrix[i][j] = 0.0;
}
}
}
Matrix::~Matrix() {
for(uint i = 0; i < numRows(); ++i) {
delete[] matrix[i];
}
delete[] matrix;
}
const uint Matrix::numRows() const {
return this->rows;
}
const uint Matrix::numCols() const {
return this->cols;
}
double & Matrix::at(uint row, uint col) {
return matrix[row][col];
}
const double & Matrix::at(uint row, uint col) const {
return matrix[row][col];
}
Matrix Matrix::add(double s) const {
uint r = this->numRows();
uint c = this->numCols();
Matrix * result;
result = new Matrix(r, c);
for(uint i = 0; i < r; ++i) {
for(uint j = 0; j < c; ++j) {
result->at(i,j) = (this->at(i,j)) + s;
}
}
return * result;
}
主.cpp
#include <iostream>
#include <cstdlib>
#include "matrix.h"
using namespace std;
typedef unsigned int uint;
int main() {
Matrix * matrix;
matrix = new Matrix(3, 2); //Works fine
double scaler = 5;
matrix->at(2,1) = 5.0; //Works fine
Matrix r = matrix->add(scaler); //DOESN'T WORK
return EXIT_SUCCESS;
}
知道为什么add
函数会导致分段错误吗?我用来填充结果矩阵对象的 for 循环并没有越界,而且我对C++不够熟悉,不知道还有什么可能导致它。
提前谢谢。
问题是缺少手动定义的复制构造函数或赋值运算符,因为该类管理资源(内存)。
如果分配了类的实例或用于创建副本,则结果将是引用同一内存的两个不同对象。 当引用同一内存的两个对象被销毁时,内存被释放两次。 其结果是未定义的行为。
查找"三法则"以找到解决方案。 在C++11中,这通常成为"五法则"或"零法则"(涉及首先使用技术来避免问题)。
add()
函数中还有一个相当严重的问题,因为它动态创建一个Matrix
,然后返回它的副本。 这会导致内存泄漏,即使复制对象的问题已解决。 该函数实际上看起来像是用垃圾回收语言编写的东西 - 问题是C++不是垃圾回收。
相关文章:
- 为什么在全局范围内使用"extern int a"似乎不行?
- 尝试通过多个向量访问变量时,向量下标超出范围
- 错误:未在此范围内声明'reverse'
- 正在将指针转换为范围
- 使用std::transform将一个范围的元素添加到另一个范围中
- 在基于范围的for循环中使用结构化绑定声明
- 如何计算数据类型的范围,例如int
- 为什么 const std::p air<K,V>& 在 std::map 上基于范围的 for 循环不起作用?
- 在C++中查找范围的长度
- 如何设置一个范围来提取我想要获得的信息
- 并行用于C++17中数组索引范围内的循环
- 为左值和右值的包装器实现C++范围
- 求出有多少个数字是完美平方,而sqrt()是L,R范围内的素数
- 关于:C++中异常对象的范围:为什么我没有得到副本?
- 超出范围时使用对象
- 不计算一个范围内的完美数
- ";结果类型必须是可从输入范围的值类型""构造的;创建std::vector时
- 基于范围的 for 循环:迭代使用一个元素扩展的向量
- 如何访问超出其块范围的对象?
- 矢量下标超出SFML游戏中的范围