static类型指针使用中的问题(AVPicture 类型内存释放)
2015-07-13 16:23
253 查看
这段代码要实现的功能是对out->pict区域的内容进行保存,当下一帧刷新的时候释放上一帧的内容。代码段1是可以正常运行的,代码段2,当对pOutLastPic指向的内存空间进行访问的时候程序崩溃。区别在于,代码段2在else中先对out->pict进行释放,之后才保存。当然保存不到什么东西。问题出现的根源是对静态的out指针,指向的内存区域是同一块这个问题不够敏感。虽然名字变成pOutLastPic,但是指向内存区域仍然是一个。
代码段1:
status_t MediaPlayer::glrender(){
static AVPictureList *out = NULL;
struct timeval tv;
if (out == NULL)
{
out = (AVPictureList*)av_malloc(sizeof(AVPictureList));
if (out == NULL)
{
mbDrawing = false;
return 0;
}
}
mPictureQueue->get(out,true);
if (pOutLastPic == NULL)
{
Log::d(ANDROID_LOG_INFO,TAG,"pOutLastPic get first frame");
mOutLastPic = out->pict;
pOutLastPic = (AVPicture*)(&(mOutLastPic));
}else{
avpicture_free(pOutLastPic);
mOutLastPic = out->pict;
pOutLastPic = (AVPicture*)(&(mOutLastPic));
}
}
代码段2:
status_t MediaPlayer::glrender(){
static AVPictureList *out = NULL;
struct timeval tv;
if (out == NULL)
{
out = (AVPictureList*)av_malloc(sizeof(AVPictureList));
if (out == NULL)
{
mbDrawing = false;
return 0;
}
}
mPictureQueue->get(out,true);
if (pOutLastPic == NULL)
{
Log::d(ANDROID_LOG_INFO,TAG,"pOutLastPic get first frame");
//mOutLastPic = out->pict;
pOutLastPic = (AVPicture*)(&(out->pict));
}else{
avpicture_free(pOutLastPic);
//mOutLastPic = out->pict;
pOutLastPic = (AVPicture*)(&(out->pict));
}
}
代码段1:
status_t MediaPlayer::glrender(){
static AVPictureList *out = NULL;
struct timeval tv;
if (out == NULL)
{
out = (AVPictureList*)av_malloc(sizeof(AVPictureList));
if (out == NULL)
{
mbDrawing = false;
return 0;
}
}
mPictureQueue->get(out,true);
if (pOutLastPic == NULL)
{
Log::d(ANDROID_LOG_INFO,TAG,"pOutLastPic get first frame");
mOutLastPic = out->pict;
pOutLastPic = (AVPicture*)(&(mOutLastPic));
}else{
avpicture_free(pOutLastPic);
mOutLastPic = out->pict;
pOutLastPic = (AVPicture*)(&(mOutLastPic));
}
}
代码段2:
status_t MediaPlayer::glrender(){
static AVPictureList *out = NULL;
struct timeval tv;
if (out == NULL)
{
out = (AVPictureList*)av_malloc(sizeof(AVPictureList));
if (out == NULL)
{
mbDrawing = false;
return 0;
}
}
mPictureQueue->get(out,true);
if (pOutLastPic == NULL)
{
Log::d(ANDROID_LOG_INFO,TAG,"pOutLastPic get first frame");
//mOutLastPic = out->pict;
pOutLastPic = (AVPicture*)(&(out->pict));
}else{
avpicture_free(pOutLastPic);
//mOutLastPic = out->pict;
pOutLastPic = (AVPicture*)(&(out->pict));
}
}
相关文章推荐
- 关于指针的一些事情
- Managed Media Aggregation using Rtsp and Rtp
- C# Pointer指针应用实例简述
- C++智能指针实例详解
- C++指向函数的指针实例解析
- 关于c语言指针的两处小tip分享
- 浅析iterator与指针的区别
- 探讨C++中数组名与指针的用法比较分析
- C语言安全之数组长度与指针实例解析
- C++中指向对象的常指针与指向常对象的指针详解
- 指向变量的常指针与指向常变量的指针详细解析
- C#通过指针实现快速拷贝的方法
- php中将指针移动到数据集初始位置的实现代码[mysql_data_seek]
- C#通过指针读取文件的方法
- C语言指针学习经验总结浅谈
- 利用Ffmpeg获得flv视频缩略图和视频时间的代码
- C++交换指针实例
- C/C++中指针和引用之相关问题深入研究
- C++基础入门教程(四):枚举和指针
- c++传递函数指针和bind的示例