C++中的动态矩阵

Dynamic matrix in C++

本文关键字:动态 C++      更新时间:2023-10-16

>我正在使用一个多维数组,但我得到了一个异常,我已经搜索了很多,但我找到了我正在使用的相同答案,当我尝试分配 matriz[i] = 新的双精度[n] 时,异常会跳转。我已经尝试了评论和未评论的解决方案,但没有运气。

void interpol(double *arr_x, double *arr_y, int n, double *results) {
    //double** matriz = new double*[n];
    double** matriz;
    matriz = (double**) malloc(n * sizeof(double*));
    for(int i = 0; i < n; i++){    
        //matriz[i] = new double[n+1];
        matriz[i] = (double*) malloc(n+1 * sizeof(double));
        for(int j = 0; j < n; j++) {
            matriz[i][j] = pow(arr_x[i],j);
        }
        matriz[i][n] = arr_y[i];
    }
    gaussiana(matriz, n, results);
}

---编辑---

高斯亚纳函数工作正常,因为我已经在这个函数之外进行了测试。在以下任一情况下引发异常: 马特里兹[i] = 新双精度[n]; Matriz[i] = (double*) malloc(n * sizeof(double));

n 永远不会超过 10。

引发的异常是:

Interpolacion.exe 中0x00071c4d的第一次机会例外: 0xC0000005: 访问违规读取位置0x00000000。 在 Interpolacion.exe 中0x774b15de未处理的异常: 0xC0000005:访问冲突读取位置0x00000000。 程序"[8012] Interpolacion.exe: Native' 已退出,代码为 -1073741819 (0xc0000005)。

----编辑----我终于让它工作了,问题不在 matriz 中,而是在 arr_x/arr_y 中,外部例程发送了错误的数据(奇怪的是错误和堆栈跟踪总是将我引用到新的 double[n] 分配)

如果你想使用std::vector路由,你可以使用下面这样的东西(未经测试,仅作为指南显示)。请记住,std::vector<std::vector<double> >double ** 不兼容,因此可能需要重写 gaussiana 函数以接受新类型。

// Include the header!
#include <vector>

// Be careful about the use of "using namespace std", I'm only using it here
// because it's a small example
using namespace std;
vector<vector<double> > matriz;
for (int i = 0; i < n; i++)
{
    // Create a new vector "v" with n+1 elements
    vector<double> v(n + 1);
    // fill this vector
    for (int j = 0; j < n; j++)
        v[j] = pow(arr_x[i], j);
    v[n] = arr_y[i];   
    // add it to the matrix
    matriz.push_back(v);
}

我在代码中没有看到任何会导致异常的内容。 一定是gaussiana()造成麻烦。 尝试注释掉该行,看看程序是否仍然有故障。

知道n的范围会很有用. 只要它在现代 32 位或 64 位计算机上相对较小(<1000),malloc()就不会失败。 但是,如果程序在内存受限的情况下运行,或者n很大,则某些malloc可能会失败。 由于没有检查返回的 NULL,因此程序在尝试取消引用指针时会通过 SEGFAULTing 指示故障。

如果多次调用该函数,内存泄漏可能会导致堆严重不足,并导致malloc()失败。