我在寫一些信號處理程序,使用PortAudio庫。我正在使用包含指向浮點的指針的 結構,該指針將用作緩衝區。然後我將它傳遞給一個音頻回調函數。內存泄漏,指針改變參考
我的問題是,回調處理完成後,我的指針已改變引用,因此不能被釋放。這不是什麼大不了的事情,但是我不明白什麼時候以及如何改變指針引用,並且我感覺我失去了一些重要的東西。
下面是代碼的簡化版本:
typedef struct{
float* tmp;
//other stuff
} Data;
Data data;
data.tmp = NULL;
data.tmp = (float*) calloc(N,sizeof(float));// N is the size of the buffer
Pa_OpenDefaultStream(some args, //opens a PortAudio stream and passes tmp to callback
callback,
&data);
甲流然後在另一個高優先級線程開始,並根據需要回調正在執行多次。在回調過程中,tmp被用作環形緩衝區,並不斷被複制到新的數據。
static int callback(args,void* data){
Data* x = (Data*) tmp;
x->tmp = update();
}
其中更新()返回一個指針作爲TMP是(釋放calloc),其被初始化相同的方式浮動。
float* update(){
//do stuff
return m_tmp2;
}
float* m_tmp2 = (float*) calloc(N,sizeof(float));//same N as before
但是在關閉流之後,在退出之前調用free時出現錯誤。
free(data.tmp);//throws a SIGABRT error
一些斷點調試向我表明回調處理過程中被改變的指針引用,但我不明白何時以及如何發生的,因爲一切運行順利。它必須是回調執行期間的東西,但我確定update()會返回一個與tmp大小相同的指針。還是它與PortAudio連接?
請問任何線索?
謝謝Ari!我對所有這些指針傳遞感到困惑,現在你已經指出了它的總體意義上的問題。我已經在調試器中檢出了,並且實際上* m_tmp2的地址與data.tmp匹配。另外感謝提示,但實際上我只分配一次m_tmp2地址,它是包含update()的類的成員變量,所以它總是返回相同的地址,但我想這只是錯誤的方法。我會做更新(數據。tmp)'並複製方法內的值(使用一些memcpy)而不是返回指針。 – user3334172