使用C++List出现读取访问权限冲突的问题。求解

我创建了一个Animation类型的List用来放所有的Animation对象。animation类的实现如下

 #include "cAnimation.h"

Animation::Animation(int imgNum, TCHAR *fileName, long  frameSpeed, int xPos, int yPos)
{
    TCHAR path[100];

    m_AnimationImg = new CxImage [imgNum];//图片数组存放动画帧
    m_HeadImg = new CxImage();//保存图片数组头指针
    m_HeadImg = m_AnimationImg;

    for (int i=0;i<imgNum;i++)//添加动画帧到图片数组
    {
        swprintf_s(path, L"%s%d.png", fileName, i);
        m_AnimationImg->Load(path, CXIMAGE_FORMAT_PNG);
        m_AnimationImg++;
    }

    m_AnimationImg = m_HeadImg;

    m_frameSpeed = frameSpeed;//图片播放速度

    m_xPos = xPos;//动画显示坐标
    m_yPos = yPos;

    m_ImgNum = imgNum;//图片数量

    QueryPerformanceFrequency(&m_Frequence);//频率
    QueryPerformanceCounter(&m_StartCounter);//起始计数器
}

bool Animation::Draw(HDC m_hdc,UINT xPos,UINT yPos)
{
    static long m_time = 0,lastTime=0;//时间间隔
    QueryPerformanceCounter(&m_CurCounter);//当前计数器
    m_time = (m_CurCounter.QuadPart - m_StartCounter.QuadPart) * 1000 / m_Frequence.QuadPart;


    m_AnimationImg->Draw(m_hdc,xPos,yPos);//绘制当前图片

    //保证循环播放图片
    int static i = 0;
    if (i == m_ImgNum)
    {
        i = 0; m_AnimationImg = m_HeadImg;
    }

    //设置图片播放速度
    if (m_time - lastTime >= m_frameSpeed)
    {
        lastTime = m_time;
        i++;
        m_AnimationImg ++;
    }
    return true;
}
bool Animation::Draw(HDC m_hdc)
{
    static long m_time = 0, lastTime = 0;
    QueryPerformanceCounter(&m_CurCounter);
    m_time = (m_CurCounter.QuadPart - m_StartCounter.QuadPart) * 1000 / m_Frequence.QuadPart;


    m_AnimationImg->Draw(m_hdc, m_xPos, m_yPos);

    int static i = 0;
    if (i == m_ImgNum)
    {
        i = 0; m_AnimationImg = m_HeadImg;
    }

    if (m_time - lastTime >= m_frameSpeed)
    {
        lastTime = m_time;
        i++;
        m_AnimationImg++;
    }

    return true;
}

bool Animation::Clean()
{

    return true;
}

Animation::~Animation()
{
    //delete m_HeadImg;
    //delete [m_ImgNum] m_AnimationImg;

}

Animation::Animation()
{

}
bool Animation::Update(int xPos,int yPos)
{


    m_xPos = xPos;
    m_yPos = yPos;
    return true;
}

list定义如下

 typedef list<Animation> AnimationList;
    AnimationList m_AllAnimation;

之后在push_back()了两个animation;

如果只放一个animation不会出现读取访问权限冲突的问题。放两个animation进去,会是这样:第一个animation开始播放,第二个animation只绘制出了第一张图片,当第一个animation播放完就会出现问题图片说明

list的遍历

 bool AnimationMgr::Draw(HDC hdc)
{

    list<Animation>::iterator aniIterator;

    for (aniIterator = m_AllAnimation.begin();aniIterator != m_AllAnimation.end();++aniIterator)
    {
        (*aniIterator).Draw(hdc);
    }
    return true;
}

请问是什么原因呢?

4个回答

已解决。将animation里面的图片数组使用下标方式访问。而不是指针方式

(*aniIterator).Draw(hdc);   //记得清除第一个,然后在绘制第二个。。
qq_33537854
猫牌铅笔 好的。谢谢
3 年多之前 回复
shen_wei
shen_wei 最后的方式自己单步运行,看看走到具体那里出错,才是关键!!!
3 年多之前 回复
qq_33537854
猫牌铅笔 我现在把代码改成这样子: list<Animation>::iterator aniIterator; aniIterator = m_AllAnimation.begin(); (*aniIterator).Draw(hdc); 只画list里面的第一个animation,可是还是会出读取访问异常。但是如果list里面只有一个animation又不会出错,是怎么回事呢?
3 年多之前 回复

求解答。写代码卡在这地方了。

这种引发断点的最好办法是进行调试,还有你代码看不出什么问题

立即提问
相关内容推荐