C++第二次动态分配,而第一次工作(相同大小)

标签 c++ malloc

我曾经使用 3D 动态分配数组,但我了解到一维数组具有更好的性能,因此我尝试将我的 3D 数组转换为一维数组。

我使用两个大数组(大约 240*320*1000 双),分配看起来像这样:

int numberFiles; //about 1000, can change
int nRow; //240
int nCol; //320
double *inputData;
double *outputData;

inputData = (double*)malloc(nCol*nRow*numberFiles*sizeof(double)); //Always works
outputData = (double*)malloc(nCol*nRow*numberFiles*sizeof(double)); //Always fails

第二次分配总是失败。由于第一个没有,所以这不是尺寸问题。而且,当在 3D 数组中分配它时,它也可以工作,这不是内存空间问题

知道第二次分配失败的原因吗?

谢谢。

陈松。

PS:抱歉英语不好。

PS2:尝试了 new Double[],同样的问题。

编辑:所以在一个简单的代码中进行分配是可行的,但是当我尝试将它放入我的应用程序时,它就不再起作用了。我正在使用带有 mingw32 的 QtCreator 并使用 matio(用于读取 MATLAB 文件的库)来读取数据。这是我的程序的代码示例,它给我错误:

//Needed include
using namespace std;

int main(int argc, char ** argv)
{

    int k,i,j;
    double *matriceBrute,*matriceSortie;
    double* matData;
    const char * c;
    mat_t *matfp;
    matvar_t *matvar;

    QApplication app(argc,argv);
    // Getting the directory of the data and the files in it
    QString directoryPath = QFileDialog::getExistingDirectory();
    QDir myDir(directoryPath);
    myDir.setNameFilters(QStringList()<<"*.MAT");
    QStringList filesList = myDir.entryList(QDir::Files | QDir::Hidden);
    string fullPath= (directoryPath+"/"+filesList[0]).toLocal8Bit().constData();
    c = fullPath.c_str();
    // Loading the first one to get the size of the data
    matfp = Mat_Open(c,MAT_ACC_RDONLY);
    matvar = Mat_VarReadNextInfo(matfp);
    int read_err = Mat_VarReadDataAll(matfp,matvar);
    int numberFiles = (int)filesList.size();
    int nCol = matvar->dims[1];
    int nRow = matvar->dims[0];
    //Allocating
    matriceBrute = (double*)malloc(nCol*nRow*numberFiles*sizeof(double));

    matriceSortie = (double*)malloc(nCol*nRow*numberFiles*sizeof(double));
    //the first one works but not the second

    //loading the data in the allocated memory
    for (k=0;k<numberFiles;k++)
    {
        fullPath= (directoryPath+"/"+filesList[k]).toLocal8Bit().constData();
        c = fullPath.c_str();
        matfp = Mat_Open(c,MAT_ACC_RDONLY);
       matvar = Mat_VarReadNext(matfp);
        matData = (double*)(matvar->data);
        for (i=0;i<nRow;i++)
        {
            for (j=0;j<nCol;j++)
            {
                matriceBrute[i + nRow*(j+k*nCol)]=*(matData+(i+j*nRow));
                matriceSortie[i + nRow*(j+k*nCol)]=*(matData+(i+j*nRow));
            }

        }
        Mat_VarFree(matvar);
        Mat_Close(matfp);
    }
}

最佳答案

没有错误,它有效。

#include <iostream>
using namespace std;

int main()
{
int numberFiles = 1000; //about 1000, can change
int nRow = 240; //240
int nCol = 240; //320
double *inputData;
double *outputData;

inputData = (double*)malloc(nCol*nRow*numberFiles*sizeof(double)); //Always works
outputData = (double*)malloc(nCol*nRow*numberFiles*sizeof(double)); //Always fails
if (inputData == NULL)
  cout << "inputData alloc failed" << endl;
  if (outputData == NULL)
  cout << "outputData alloc failed" << endl;
    return 0;
}

它不会打印为失败,所以,别担心,开心点。

关于C++第二次动态分配,而第一次工作(相同大小),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22957857/

相关文章:

c++ - c/c++当size为0时strncmp的返回值是多少

c++ - 常量 reference_wrapper

c++ - 为什么当我们打印指向字符类型的指针时,C++ 会显示字符?

c - 使用 memcpy 从缓冲区复制到结构数组时出现 SEGFAULT

c - 免费(): invalid next size (fast) error

c - C 中的 Malloc 内存消耗行为

c++ - 加载前修改汇编指令

c - 使用多个线程分配内存时出现段错误

c - C中的malloc内存分配方案

c++ - 如何模拟不存在的 find_first_not_of 函数?