簡體   English   中英

多個文件的 Memory 分配錯誤“在拋出 'std::bad_alloc' 的實例后調用終止什么 ():std::bad_alloc” [C ++]

[英]Memory allocation error for multiple files “terminate called after throwing an instance of 'std :: bad_alloc' what (): std :: bad_alloc” [C ++]

我正在為數字語音信號處理項目使用分類器算法。 開發此算法是為了在單個向量中接收所有音頻信號以進行處理,但我遇到了問題,因為我正在處理的文件數量非常大並且正在生成錯誤“拋出一個' std:: bad_alloc 'what (): std:: bad_alloc 的實例。 我想知道是否可以在不超過可用 memory 空間的情況下對讀取文件並將它們存儲在向量中的代碼進行任何更改。

讀取文件的代碼:

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 動態數組,但是在你的程序中,你沒有釋放 Z76AA96369ABBBA52E621BFA83Z76AA96369ABBBA52E621BFA83 數組使用的 memory泄漏的,我不能為你刪除,因為我無法閱讀那個怪物......

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM