c++ - 多个文件的内存分配错误 “terminate called after throwing an instance of ' std::bad_alloc'what():std::bad_alloc” [C++]

标签 c++ memory-management dynamic-memory-allocation memory-limit multiple-file-upload

我正在为数字语音信号处理项目使用分类器算法。该算法的开发目的是在单个 vector 中接收所有音频信号以进行处理,但是我遇到了问题,因为我正在处理的文件数量非常大,并且会生成错误“在抛出'std::bad_alloc'what()的实例:std::bad_alloc“。我想知道是否有可能对读取文件并将它们更有效地存储在 vector 中的代码进行任何更改,而不会超出可用的存储空间。
读取文件的代码:

string filename;
    filename="C:\\Users\\marcu\\Desktop\\TCC\\Arquivos_10780\\Arquivos_DFT_TXT_512\\PA_D_00";

    std::vector<double> c;

    for(int j=1; j<=5400; j++)
    {
        stringstream ss;
        ss << filename << setw(5) << setfill('0') << j << "_bonafide_DFT.txt";

        std::ifstream f;
        f.open(ss.str().c_str());

        if (f.is_open())
        {
            double num;

            while (f >> num)
                c.push_back(num);

            f.close();
        }
        else
        {
            f.close();
            continue;
        }
    }

    for(int j=5401; j<=29700; j++)
    {
        stringstream ss;
        ss << filename << setw(5) << setfill('0') << j << "_spoof_DFT.txt";

        std::ifstream f;
        f.open(ss.str().c_str());

        if (f.is_open())
        {
            double num;

            while (f >> num)
                c.push_back(num);

            f.close();
        }
        else
        {
            f.close();
            continue;
        }
    }
完整代码:
#include<stdio.h>
#include<math.h>
#include<string.h>
#include<iostream>
#include<fstream>
#include<string>
#include<vector>
#include<stdlib.h>
#include<iomanip>
#include<sstream>

using namespace std;

double mean_similarities(double**,int,int);//vectors, number of vectors, their dimension

int main()
{
    const int number_of_classes=2;
    int number_of_feature_vectors_in_class[number_of_classes];
    number_of_feature_vectors_in_class[0]=2700;
    number_of_feature_vectors_in_class[1]=8080;
    const int dimension_of_each_feature_vector=512;

////////////////////////////////////////////////////////////////////////////////////////////
/*
Example: 3 classes and 4 vectors of dimension 2 in each class
{{0.90,0.12},{0.88,0.14},{0.88,0.13},{0.89,0.11}}   //0.88---0.90 ; 0.11---0.14
{{0.55,0.53},{0.53,0.55},{0.54,0.54},{0.56,0.54}}   //0.53---0.56 ; 0.53---0.55
{{0.10,0.88},{0.11,0.86},{0.12,0.87},{0.11,0.88}}   //0.10---0.12 ; 0.86---0.88  

double c[]={ 
0.90,0.12,0.88,0.14,0.88,0.13,0.89,0.11,
0.55,0.53,0.53,0.55,0.54,0.54,0.56,0.54,
0.10,0.88,0.11,0.86,0.12,0.87,0.11,0.88
//all vectors in class C_1, followed by all vectors in C_2, ...., followed by all in C_n
            };
*/
////////////////////////////////////////////////////////////////////////////////////////////

    string filename;
    filename="C:\\Users\\marcu\\Desktop\\TCC\\Arquivos_10780\\Arquivos_DFT_TXT_512\\PA_D_00";

    std::vector<double> c;

    for(int j=1; j<=5400; j++)
    {
        stringstream ss;
        ss << filename << setw(5) << setfill('0') << j << "_bonafide_DFT.txt";

        std::ifstream f;
        f.open(ss.str().c_str());

        if (f.is_open())
        {
            double num;

            while (f >> num)
                c.push_back(num);

            f.close();
        }
        else
        {
            f.close();
            continue;
        }
    }

    for(int j=5401; j<=29700; j++)
    {
        stringstream ss;
        ss << filename << setw(5) << setfill('0') << j << "_spoof_DFT.txt";

        std::ifstream f;
        f.open(ss.str().c_str());

        if (f.is_open())
        {
            double num;

            while (f >> num)
                c.push_back(num);

            f.close();
        }
        else
        {
            f.close();
            continue;
        }
    }

////////////////////////////////////////////////////////////////////////////////////////////
//edit whatever you need, according to the feature vectors of your problem, ABOVE this line.
//Do NOT change anything BELOW this line !!!!!
////////////////////////////////////////////////////////////////////////////////////////////
    double*** C=new double**[number_of_classes];
    for(int i=0; i<number_of_classes; i++)
        C[i]=new double*[number_of_feature_vectors_in_class[i]];
    for(int i=0; i<number_of_classes; i++)
        for(int j=0; j<number_of_feature_vectors_in_class[i]; j++)
            C[i][j]=new double[dimension_of_each_feature_vector];
    int l=0;
    for(int i=0; i<number_of_classes; i++)
        for(int j=0; j<number_of_feature_vectors_in_class[i]; j++)
            for(int k=0; k<dimension_of_each_feature_vector; k++)
            {
                C[i][j][k]=c[l];
                l++;
            }

//Debug info only
//for(int i=0;i<number_of_classes;i++)
//  for(int j=0;j<number_of_feature_vectors_in_class[i];j++)
//      for(int k=0;k<dimension_of_each_feature_vector;k++)
//          printf("\nclass %d vector %d element %d is %.3f",i,j,k,C[i][j][k]);
//getchar();
    double Y[number_of_classes];
    for(int i=0; i<number_of_classes; i++)
        Y[i]=mean_similarities(C[i],number_of_feature_vectors_in_class[i],dimension_of_each_feature_vector);
    double alpha=Y[0];
    for(int i=1; i<number_of_classes; i++)
        if(Y[i]<alpha)
            alpha=Y[i];
    printf("\nALPHA: %.3f",alpha);
    double** smallest_range_vector_for_class=new double*[number_of_classes];
    for(int i=0; i<number_of_classes; i++)
        smallest_range_vector_for_class[i]=new double[dimension_of_each_feature_vector];
    for(int i=0; i<number_of_classes; i++)
        for(int k=0; k<dimension_of_each_feature_vector; k++)
            smallest_range_vector_for_class[i][k]=C[i][0][k];
    for(int i=0; i<number_of_classes; i++)
        for(int j=1; j<number_of_feature_vectors_in_class[i]; j++)
            for(int k=0; k<dimension_of_each_feature_vector; k++)
                if(C[i][j][k]<smallest_range_vector_for_class[i][k])
                    smallest_range_vector_for_class[i][k]=C[i][j][k];

//Debug info only
//for(int i=0;i<number_of_classes;i++)
//  for(int k=0;k<dimension_of_each_feature_vector;k++)
//          printf("\nclass %d smallest component %d is %.3f",i,k,smallest_range_vector_for_class[i][k]);
    double** largest_range_vector_for_class=new double*[number_of_classes];
    for(int i=0; i<number_of_classes; i++)
        largest_range_vector_for_class[i]=new double[dimension_of_each_feature_vector];
    for(int i=0; i<number_of_classes; i++)
        for(int k=0; k<dimension_of_each_feature_vector; k++)
            largest_range_vector_for_class[i][k]=C[i][0][k];
    for(int i=0; i<number_of_classes; i++)
        for(int j=1; j<number_of_feature_vectors_in_class[i]; j++)
            for(int k=0; k<dimension_of_each_feature_vector; k++)
                if(C[i][j][k]>largest_range_vector_for_class[i][k])
                    largest_range_vector_for_class[i][k]=C[i][j][k];

//Debug info only
//for(int i=0;i<number_of_classes;i++)
//  for(int k=0;k<dimension_of_each_feature_vector;k++)
//          printf("\nclass %d largest component %d is %.3f",i,k,largest_range_vector_for_class[i][k]);
    int R=0;
    int F=0;
    for(int ia=0; ia<number_of_classes; ia++)
        for(int ib=0; ib<number_of_classes; ib++)
            for(int j=0; j<number_of_feature_vectors_in_class[ib]; j++)
                for(int k=0; k<dimension_of_each_feature_vector; k++)
                {
                    if(ib!=ia)
                    {
                        if((C[ib][j][k]>smallest_range_vector_for_class[ia][k])&&(C[ib][j][k]<largest_range_vector_for_class[ia][k]))
                            R++;
                        F++;
                    }
                }
    double beta=((double)(R))/((double)(F));
    printf("\nBETA: %.3f",beta);
    printf("\nP=(G1,G2)=(%.3f,%.3f)",alpha-beta,alpha+beta-1);
    printf("\nDistance from P to (1,0): %.3f",sqrt(pow((alpha-beta)-1,2)+pow(alpha+beta-1,2)));
    printf("\n\n");
}
/////////////////////////////////////////////
////////////////////////////////////////////
double mean_similarities(double** v,int n, int t)
{
    double largest;
    double smallest;
    double* s=new double[t];
    for(int i=0; i<t; i++)
    {
        smallest=1;
        largest=0;
        for(int j=0; j<n; j++)
        {
            if(v[j][i]>largest)
                largest=v[j][i];
            if(v[j][i]<smallest)
                smallest=v[j][i];
        }
        s[i]=1-(largest-smallest);
    }
    double m=0;
    for(int i=0; i<t; i++)
        m+=s[i];
    m/=((double)(t));
    return(m);
}
PS:要找到最佳的分类器结果,我需要将文件大小(每个文件的信息量)的大小更改为越来越大的值。起初有512点,但是每次执行时我将此值加倍,直到达到8192,但是当我尝试使用16384时,代码崩溃。我正在使用10780个文件,其中每个文件都具有相同的尺寸,并在检查结果时增加它。

最佳答案

首先,下面有很多问题:

double** largest_range_vector_for_class=new double*[number_of_classes];
    for(int i=0; i<number_of_classes; i++)
        largest_range_vector_for_class[i]=new double[dimension_of_each_feature_vector];
    for(int i=0; i<number_of_classes; i++)
        for(int k=0; k<dimension_of_each_feature_vector; k++)
            largest_range_vector_for_class[i][k]=C[i][0][k];
    for(int i=0; i<number_of_classes; i++)
        for(int j=1; j<number_of_feature_vectors_in_class[i]; j++)
            for(int k=0; k<dimension_of_each_feature_vector; k++)
                if(C[i][j][k]>largest_range_vector_for_class[i][k])
                    largest_range_vector_for_class[i][k]=C[i][j][k];
我什至看不懂,但我确实了解了要点,基本上,您创建了一个动态数组,一个3D动态数组,但是在程序中没有任何地方释放3D数组使用的内存,它看起来非常漏水,我无法为您删除,因为我在阅读该怪兽时遇到了麻烦...。

关于c++ - 多个文件的内存分配错误 “terminate called after throwing an instance of ' std::bad_alloc'what():std::bad_alloc” [C++],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62886006/

相关文章:

c++ - “no user-provided default constructor”警告仅适用于gcc

debugging - 如何调试 Flink 应用程序进行内存和垃圾收集?

c++ - De-allcoating 动态分配的多维数组。

c - 从 csv 文件读取和动态内存分配

c - 动态内存C、realloc异常

c++ - 交换后 vector 会保持连续吗?

c++ - 在 Embarcadero Tools API 中的光标位置插入文本

c++ - 使用 Memory Sanitizer 检测 libc++

c++ - 了解 mingw/g++ 中的内存管理

c - 使用 Malloc 通过 GMP 处理大量数据