内存泄漏,指针更改参考

时间:2014-02-20 19:59:45

标签: pointers reference free calloc portaudio

我正在使用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链接?

请,任何线索?

1 个答案:

答案 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 *)都可以被释放(不只是第一个回调被调用之前的第一个...