首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

C++ 讀取 .dat 文件並存入 FFTW 數組:內存分配失敗的常見原因與修復

     編輯:程式設計疑難解答

C++ 讀取 .dat 文件並存入 FFTW 數組:內存分配失敗的常見原因與修復

使用 FFTW 庫處理信號時,fftw_malloc 分配失敗通常源於參數錯誤或指針未初始化。以下針對典型代碼問題逐一分析:

錯誤代碼片段回顧

// 分配失敗檢查
if((in1==NULL)||(out==NULL)){
    // 提示失敗
}
// 但 in1、out 從未被賦值!

核心問題

  1. 指針未初始化:in1、out 宣告但未分配內存,直接判斷 ==NULL 為真,誤以為分配失敗。
  2. 變量名不一致:分配的是 in,檢查卻用 in1。
  3. N 值過大:若 N 超過可用內存,fftw_malloc 確會返回 NULL,需檢查 N 定義。

正確分配模式

const int N = 1024; // 確保合理
fftw_complex *in  = (fftw_complex*) fftw_malloc(sizeof(fftw_complex) * N);
fftw_complex *out = (fftw_complex*) fftw_malloc(sizeof(fftw_complex) * N);

if (in == NULL || out == NULL) {
    // 真正的分配失敗處理
    fftw_free(in); fftw_free(out);
    return;
}

// 讀取 .dat 文件
std::ifstream fin("data.dat", std::ios::binary);
fin.read(reinterpret_cast(in), sizeof(fftw_complex) * N);
// ... FFTW 處理 ...

fftw_free(in);
fftw_free(out);

關鍵注意點

  • fftw_malloc 保證內存對齊(SIMD 指令集要求),必須配對 fftw_free 釋放,不可用 free 或 delete。
  • 讀取二進制文件時,確認文件大小與 N * sizeof(fftw_complex) 一致,避免讀越界。
  • MFC 界面線程中執行耗時操作會導致界面凍結,建議放入工作線程(AfxBeginThread)。

修正指針初始化與變量名,即可解決「內存申請失敗」的誤報。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved