m0_56343782 2023-03-19 16:46 采纳率: 42.9%
浏览 13

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

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

#include <graphics.h>
#include <conio.h>
#include<ctime>
#include "ShowPrint.h"
#include<cmath>
#include<iostream>
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;j<m;j++){
        b[j]=rand()%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;x<m;x++){
            if(i==b[x] && c2[x].y<-200)c2[x].y=-200;
            putimage(c2[x].x,c2[x].y,&img);
        }
        
        for(int j=0;j<m;j++){
            if(c2[j].y>-201)c2[j].y+=speed;
        }
        
        i++;
        for(int v=0;v<m;v++){
            if(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;
}

  • 写回答

2条回答 默认 最新

  • lshen01 2023-03-19 16:57
    关注

    参考GPT和自己的思路:

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

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

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

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

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

    评论

报告相同问题?

问题事件

  • 创建了问题 3月19日

悬赏问题

  • ¥15 两台交换机分别是trunk接口和access接口为何无法通信,通信过程是如何?
  • ¥15 C语言使用vscode编码错误
  • ¥15 用KSV5转成本时,如何不生成那笔中间凭证
  • ¥20 ensp怎么配置让PC1和PC2通讯上
  • ¥50 有没有适合匹配类似图中的运动规律的图像处理算法
  • ¥15 dnat基础问题,本机发出,别人返回的包,不能命中
  • ¥15 请各位帮我看看是哪里出了问题
  • ¥15 vs2019的js智能提示
  • ¥15 关于#开发语言#的问题:FDTD建模问题图中代码没有报错,但是模型却变透明了
  • ¥15 uniapp的h5项目写一个抽奖动画