gpt4 book ai didi

c++ - 段错误但数组对象没有越界 (C++)

转载 作者:行者123 更新时间:2023-11-28 05:35:59 24 4
gpt4 key购买 nike

还有其他关于段错误常见原因的帖子,但我不认为我在此处创建的内置数组对象 (result) 在我创建时不会越界给它赋值。
我认为这可能对将来拥有不超出范围的数组的人有帮助,而且我也没有看到很多关于制作 2D 内置数组对象的东西——我看到的例子几乎完全是 vector 或标准:数组对象。

这里是可运行的,相关代码:

矩阵.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;
}

main.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 函数会导致段错误吗?我用来填充结果 Matrix 对象的 for 循环没有超出范围,而且我对 C++ 不够熟悉,不知道还有什么可能导致它。
提前致谢。

最佳答案

问题是缺少手动定义的复制构造函数或赋值运算符,因为该类管理资源(内存)。

如果类的实例被分配或用于创建拷贝,结果将是两个引用相同内存的不同对象。当引用同一内存的这两个对象被销毁时,内存将被释放两次。其结果是未定义的行为。

查找“三法则”以获得解决方案。在 C++11 中,这通常会变成“五规则”或“零规则”(涉及首先使用技术来避免问题)。

add() 函数中还有一个非常重要的问题,因为它会动态创建一个 Matrix,然后返回它的一个拷贝。这会导致内存泄漏,即使复制对象的问题已解决。该函数实际上看起来像是用垃圾收集语言编写的东西 - 问题是 C++ 不是垃圾收集。

关于c++ - 段错误但数组对象没有越界 (C++),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38295813/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com