我正在使用PortAudio库编写一些信号处理程序。我正在使用 包含指向float的指针的结构,该指针用作缓冲区。然后我将它传递给音频回调函数。
我的问题是在回调处理完成后,我的指针已经改变了引用,因此无法释放。这不是什么大问题,但问题是我不明白指针引用何时以及如何改变,我感觉我错过了一些重要的东西。
以下是代码的简化版本:
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();
}
其中update()返回指向float的指针,该指针的初始化方式与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 :(得分:0)
我不确定我是否理解正确。每次调用回调函数时都分配了float(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的指针值,因为它在堆中重新分配一个新的内存位置并改变了tmp的指向位置..
float* update(){
//do stuff
return m_tmp2;
}
每次调用回调函数时,data.tmp必须指向一个新位置。所以,我不明白为什么它不像你描述的那样表现。 那已经是正确的行为..也许我想念一切?
也许你应该提供一种跟踪缓冲区的机制..所以你为循环缓冲区分配的所有tmp(float *)都可以被释放(不只是第一个回调被调用之前的第一个...