vs#c++#的内存冲突的问题应该如何解决呢?

我想要使用vs2010的c++进行编程一个开车小游戏,但是在使用图像批处理函数时发生了内存冲突问题。
我发现他原本运行的好好的,突然就卡住了。点击关闭按钮就弹出来一个窗口,如下图。
我检查了多遍代码,发现去掉图像批处理函数后可以运行,但是会出现闪烁的问题。这令我很头大。
我现在急切的需要一个有效的解决方案,让程序能够正常运行且不发生闪烁。
如果有可以解决问题的方案请分享出来,让其他的遇到同样问题的网友得到解决,谢谢了。
我的代码如下。

#include 
#include 
#include
#include "ShowPrint.h"
#include
#include
using namespace std;
struct car{
    int x;
    int y;
    int width;
    int hight;
};
struct BK{
    int x;
    int y;
    IMAGE img;
};
const int m=6;
int textx=0,score=0,speed=6,i=-5,r=5,sbx,b[m],clocks,clocko,zzz=144;
char s[9];
bool bool_;
ExMessage em;
IMAGE img,bg,sbl;
car c1;
car    c2[m];
bool aaaaaa(int ax1,int ay1,int ax2,int ay2,int bx1,int by1,int bx2,int by2){
    if(ax1<=bx1&&bx1<=ax2&&ay1<=by1&&by1<=ay2 || ax1<=bx2&&bx2<=ax2&&ay1<=by2&&by2<=ay2)return 1;
    return 0;
}
void initset(){
    c1.hight=200;
    c1.width=100;
    c1.x=0;
    srand((unsigned)time(0));
    initgraph(800, 800,EX_SHOWCONSOLE);
    loadimage(&img,_T("C:\\Users\\jiang\\Desktop\\tt.png"),100,200);
    loadimage(&bg,_T("C:\\Users\\jiang\\Desktop\\ttt.png"),800,800);
    loadimage(&sbl,_T("C:\\Users\\jiang\\Desktop\\123.jpg"));
    for(int j=0;jrand()%800;
        c2[j].y=-201;
        c2[j].x=(rand()%8)*100;
        c2[j].width=100;
        c2[j].hight=200;
    }
}
void draw(){
    cleardevice();
    BeginBatchDraw();
        putimage(0,i%800,&bg);
        putimage(0,i%800-800,&bg);
        
        for(int x=0;xif(i==b[x] && c2[x].y<-200)c2[x].y=-200;
            putimage(c2[x].x,c2[x].y,&img);
        }
        
        for(int j=0;jif(c2[j].y>-201)c2[j].y+=speed;
        }
        
        i++;
        for(int v=0;vif(c2[v].y>=800){
                c2[v].x=rand()%800+5;
                c2[v].y=-200;
                i=0-r;
            }if(aaaaaa(c2[v].x,c2[v].y,c2[v].x+c2[v].width,c2[v].y+c2[v].hight,c1.x,800-300,c1.x+c1.width,800-300+200)){
                print("%d",193894243);
                exit(0);
            }
        }
        sprintf(s, "%d", score);
        settextcolor(RGB(rand()%256,rand()%256,rand()%256));
        outtextxy(textx, 0, s);
        bool_=peekmessage(&em);
        sbx=em.x;
        if(sbx<700)c1.x=sbx;
        if(score%5500==5499)speed++;
        putimage(c1.x,800-300,&img);
        EndBatchDraw();
}int main()
{
    initset();
    while(1){
        clocks=clock();
        textx++;
        if(textx>=780)textx=0;
        score++;
        draw();
        clocko=clock();
        Sleep(1000/zzz-(clocko-clocks));
    }
    _getch();                // 按任意键继续
    closegraph();            // 关闭绘图窗口
    return 0;
}

参考GPT和自己的思路:

关于内存冲突的问题,可能是由于图像批处理函数的使用导致的。你可以尝试在进行图像批处理的时候使用加锁机制,以避免内存冲突的问题。具体方法如下:

1.在进行图像批处理函数之前,使用一把锁将共享的内存资源锁住。可以使用Windows API提供的临界区或者互斥对象等机制实现加锁。

2.进行图像批处理函数时,仅允许一个线程进行操作。可以使用单独的线程来进行图像批处理,避免多个线程同时访问内存资源产生冲突。

3.在图像批处理结束后,释放锁,使其他线程可以继续访问这些内存资源。

需要注意的是,在使用加锁机制时,需要谨慎处理锁的粒度,以避免锁住过多的内存资源导致性能下降。另外,还可以通过一些优化措施来减少内存冲突,例如使用缓存技术、避免频繁的内存分配和释放等。

参考GPT和自己的思路:

根据您的描述,您在使用图像批处理函数时遇到了内存冲突问题。这可能是由于内存泄漏或内存错误导致的。

以下是一些可能的解决方案:

  1. 检查代码中是否存在内存泄漏或内存错误。您可以使用内存分析工具来检查代码中的问题。Visual Studio自带了一个内存调试器,您可以使用它来检查内存问题。

  2. 尝试在代码中使用动态分配内存。这样可以避免内存冲突问题,并使代码更容易维护。使用new和delete操作符可以在运行时动态分配和释放内存。

  3. 尽量减少图像批处理的使用,以减少内存冲突的概率。您可以尝试优化代码,使用更少的图像批处理函数,或者考虑使用其他库来实现您的游戏。

希望这些解决方案对您有帮助!