c++ bad_alloc 或从文件读取路径并执行 fft 时发生内存泄漏

c++ bad_alloc or memory leak when reading paths from a file and performing fft

我正在尝试读取带有波形文件路径的文本文件,然后对它们执行 FFT。 但是有时我遇到 std::bad_alloc 错误,或者它只是挂在那里而不是 运行,内存将增加到 100+Gb(我打开一个单独的终端并监视 htop), 我猜这是一个内存泄漏问题? 有时(1% 的时间),它会 运行 顺利。

文本文件:

name1 /path/to/this/wavpath/name1.wav
name2 /path/to/this/wavpath/name2.wav
name100 /path/to/this/wavpath/name100.wav

主脚本:

int main (int argc, char ** argv) {
  // Init (Time) : These are variables for me to count the time taken for ReadingAudio and PerformingFFT
    struct timeval start, end; 
    double time_taken;
    double SUM_readaudio, SUM_computeFFT;
    double AVG_readaudio, AVG_computeFFT;
    vector<double> Dur_readaudio(100,0), Dur_computeFFT(100,0);
    gettimeofday(&start, NULL); ios_base::sync_with_stdio(false); 

  // Init (Read Audio) : These are variables for me to count the time taken for Reading Audio
    int AUDIO_DURATION = 5*8000;
    vector<double> buffer;

  // Init (FFT) : These are variables for me to count the time taken for PerformingFFT
    int nfft = 372;
    int hop_length = nfft/2;
    int numFrames;
    vector<vector<double> > Spectrogram(numFrames, vector<double>(nfft/2));

  cout << "\n==== Params =====" << endl;
    cout << " This exec name = " << argv[0] << endl;
    const char* wav_scp = argv[1];
    printf("wav_scp = %s\n", wav_scp);

  // Create Window
    vector<double> windowFunction = computeWindow(nfft);

  // Reading wav.scp
    unsigned space_idx;
    ifstream file(wav_scp);
    string uttid, wavpath, curr_line;
    int npt=0;
    string line;
    if (file.is_open()) {
      while (getline(file, line)) {
        // Get uttid and string path
          curr_line = line.c_str();
          space_idx = curr_line.find(" ");
          uttid = curr_line.substr(0, space_idx);
          wavpath = curr_line.substr(space_idx+1, curr_line.length());

        gettimeofday(&start, NULL); ios_base::sync_with_stdio(false);
        /* Read Audio */
          gettimeofday(&end, NULL); 
          time_taken = get_duration(start, end);
          cout << "time_taken=" << time_taken << endl;

        gettimeofday(&start, NULL); ios_base::sync_with_stdio(false);
        /* Compute FFT */
          gettimeofday(&end, NULL); 
          time_taken = get_duration(start, end);
          cout << "time_taken=" << time_taken << endl;

        npt++;
      }
      file.close();
    }

  cout << "Done" << endl;
  return 0 ;
}

我省略了 Read audioCompute FFT 因为我认为它们不会引起问题, 即使我省略了它们,我也面临着同样的问题。

我有时会收到以下错误消息:

terminate called after throwing an instance of 'std::bad_alloc'
  what():  std::bad_alloc
Aborted

一些观察:

  1. 注释掉所有\ Inits (*)下面多余的行,以及所有\ Read Audio&\ Compute FFT代码,可以运行成功
  2. 但是如果只是将 Inits 下的行带回,而没有 \ Read Audio\ Compute FFT 代码,bad_alloc 有时会发生。
  3. 如果我注释掉\ Get uttid and string path,并分配一个固定的wavpath,它可以顺利运行 \ Read Audio & \ Compute FFT。 (尽管它仍在迭代文本文件,但行未被使用)

变量 numFrames 未初始化。这是未定义的行为。

通常这会导致 Spectrogram 具有任意大小并且很可能非常大,这应该可以解释内存问题。