c++ - 修改大型动态大小的 3D 数组 mex/C++

标签 c++ memory-management multidimensional-array mex dynamic-arrays

短篇小说:尝试修改在运行时在堆上分配的大型 3D 数组。我相信修改数组的函数 vcross 如下所示,正在创建不会被破坏的内存。


长话短说: 我有一个大型 3D double 组(~126000x3x3 或大约 8.6MB),我需要对其运行一些操作。我不知道这个数组的第一个维度在编译时有多大,所以我使用 newdelete 操作为堆分配内存。

当我尝试将值存储到此数组时,出现分段违规。这让我认为,在将值存储到数组时,我在某个地方创建了内存,这些内存会被浪费,并最终填满堆。

代码编译正常,但在我运行时遇到段冲突。

static void inpolyh(
    double (*f)[3],//pointer to array[3], treated as 2D array where I don't know the first dimension until run-time.
    double (*v)[3],
    double (*p)[3],
    size_t numF,
    size_t numP)
{

    /*Calculate the baseNormals*/
    //allocate memory on the heap
    double (*baseNormals)[3] = NULL;//pointer to an array[3]
    if ( !(baseNormals = new double[numF][3]) ) { out_of_memory(); }

    //store the vector cross products in each array[3] of baseNormals
    for (int i=0; i<numF; i++) {
         vcross(baseNormals[i],
             v[(int)f[i][0]],
             v[(int)f[i][1]],
             v[(int)f[i][2]]);
         //THIS WORKS
    }

    /*Calculate face normals of tetrahedron*/
    //allocate memory on the heap (THIS WORKS)
    double (*faceNormals)[3][3] = NULL; //pointer to an array[3] of arrays[3]
    if ( !(faceNormals = new double[numP][3][3]) ) { out_of_memory(); }

    //store vector cross products into each array[3] of faceNormals
    for (int i=0; i<numP; i++ ) {
        for (int j=0; j<3; j++ ) {
            vcross(faceNormals[i][j],
                p[i],
                v[ (int) f[i][j] ],
                v[ (int) f[i][ (j + 1) % 3 ] ] );
            //SEG VIOLATION at i=37560
        }
    }

    delete [] baseNormals;
    delete [] faceNormals;
}

我认为这就是罪魁祸首。我认为这个函数在某个地方创建了永远不会被破坏的内存。 vector 叉积函数接受四个数组 [3] 参数,并为第一个输入参数分配一些值,该参数通过引用传递。

static void vcross(
    double (&n)[3],
    double a[3],
    double b[3],
    double c[3])
{
    n[0] = b[1] * c[2] - a[1] * c[2] + a[1] * b[2] - b[2]
                * c[1] + a[2] * c[1] - a[2] * b[1];
    n[1] = b[2] * c[0] - a[2] * c[0] + a[2] * b[0] - b[0]
                * c[2] + a[0] * c[2] - a[0] * b[2];
    n[2] = b[0] * c[1] - a[0] * c[1] + a[0] * b[1] - b[1]
                * c[0] + a[1] * c[0] - a[1] * b[0];
    return;
}

其他可能重要的细节:

  • 这是一个在 matlab 中运行的 mex 函数。
  • 默认编码:windows-1252
  • MATLAB 根目录:C:\Program Files\MATLAB\R2012b
  • MATLAB 版本:8.0.0.783 (R2012b)
  • 操作系统:Microsoft Windows 7
  • 处理器 ID:x86 系列 6 型号 58 步进 9,GenuineIntel
  • 虚拟机:Java 1.6.0_17-b04 和 Sun Microsystems Inc. Java HotSpot(TM) 64 位服务器 VM 混合模式
  • 窗口系统:版本 6.1(内部版本 7601:Service Pack 1)

最佳答案

你确定 (int)f[i][j] 总是在 [0, ) 范围内吗?我要做的第一件事是在循环运行时打印出 (int)f[i][j] 的值。或者只是启动调试器以查看崩溃时的值。

关于c++ - 修改大型动态大小的 3D 数组 mex/C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18618609/

相关文章:

c++ - 如何将个人代码添加到 wxFormBuilder 生成的类中

c++ - 如果 stdafx.h 中已包含特定 header - 我是否需要(必须/应该)将其显式包含在 .cpp 文件中?

c++ - 使用临时对象调用构造函数

c++ - C++类构造函数中的内存泄漏

c++ - 在 C/C++ 中,char* arrayName[][] 是指向指针的指针还是指向指针的指针?

Java 反射 - 使用 int[][] 参数调用方法

Ruby - 创建三角形数组

c++ - 尝试使用 boost 和 ncurses 库编译程序时出现错误

java - 有没有在没有内存开销的情况下在 Java 中存储位?

c - C中给char ***分配内存