工作总结之指针的引用

下面的代码不稳定,使用CVideoReplayer 提供的职责时有时会出错。

unsigned long WINAPI CSysncReplayer::DoReplayVideo( void * para )

{

         try

         {

                   CSysncReplayer * replayer = (CSysncReplayer*)para;

                   CVideoReplayer * videoReplayer = replayer->m_videoReplayer;

                   //begine read video info

                  while ( 1 )

                   {

            ……

}

……

}

……

}

代码分析:这是一个线程函数,当线程被中断后又继续执行的时候,就会出错。仔细分析线程被中断后又继续执行的代码,发现每次CSysncReplayer的成员变量m_videoReplayer都会被重新生成。

再看上面的代码的这一行:

CVideoReplayer * videoReplayer = replayer->m_videoReplayer;

重新定义一个指针指向replayer->m_videoReplayer请注意:这行代码在线程中断后继续时不会被执行到。

举个相同的简单例子来说:

int n = 1;

int *p1 = &n;

int *p2 = p1;

我们看一下内存

P1,p2指向同一个地方,就是变量n的地址;但是当p1指向新的变量,p2由于某种原因(看上面红色加粗体的提示)不更新,p2便与p1指向不同的地方,并且p2指向的是一个“不再使用的地址”。那么再使用p2的话肯定就会出错。

找到出错原因后,就好解决了。为了保证在int *p2 = p1;这行代码不被执行的情况下p2能与p1保持一致,需要想想办法。

此时指针的引用和指针的指针就派上用场了。

int *&p2 = p1; 或者 int **p2 = &p1; 于是,

CVideoReplayer * videoReplayer = replayer->m_videoReplayer; 修改为

CVideoReplayer *& videoReplayer = replayer->m_videoReplayer;

问题解决。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值