2014-02-20 117 views
1

我在寫一些信號處理程序,使用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連接?

請問任何線索?

回答

0

不太確定我是否理解正確。您分配的浮動(x.tmp)每一個回調函數被調用時..

static int callback(args,void* data){ 

Data* x = (Data*) tmp; 
x->tmp = update(); 
} 

我認爲上面是錯字,你實際上意味着

static int callback(args,void* data){ 

Data* x = (Data*) data; 
x->tmp = update(); 
} 

嗯,你實際上改變通過賦予它更新(),因爲它是在堆中重新分配一個新的內存位置,改變了tmp目錄的定點位置TMP的指針值..

float* update(){ 
//do stuff 
return m_tmp2; 
} 

的data.tmp必須指出,一個新的locatio n每次調用回調函數。所以,我不明白爲什麼它不像你描述的那樣行爲。 這就是正確的行爲了。也許我會錯過任何東西?

也許你應該提供一個機制來跟蹤緩衝區..所以你分配給你的循環緩衝區的所有tmp(float *)都可以被釋放(不僅僅是在第一個回調被調用之前的第一個。)

+0

謝謝Ari!我對所有這些指針傳遞感到困惑,現在你已經指出了它的總體意義上的問題。我已經在調試器中檢出了,並且實際上* m_tmp2的地址與data.tmp匹配。另外感謝提示,但實際上我只分配一次m_tmp2地址,它是包含update()的類的成員變量,所以它總是返回相同的地址,但我想這只是錯誤的方法。我會做更新(數據。tmp)'並複製方法內的值(使用一些memcpy)而不是返回指針。 – user3334172