工作总结之指针的引用

来源:互联网 发布:飞鱼网络电视tv 编辑:程序博客网 时间:2024/04/27 17:32

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

unsignedlong 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请注意:这行代码在线程中断后继续时不会被执行到。

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

intn = 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;

问题解决。

原创粉丝点击