C++ C++;可能的构造函数错误冲突写入位置
我已经将这些函数添加到我的代码中,我的程序开始随机崩溃 SDL_2.exe中0x6C7B52E7(SDL2.dll)处未处理的异常:0xC0000005:访问冲突写入位置0xFF00000C。调试器显示了完全随机的代码片段,这些代码以前工作得很好,这让我想到,这些新函数会弄乱内存C++ C++;可能的构造函数错误冲突写入位置,c++,access-violation,sdl-2,push-back,C++,Access Violation,Sdl 2,Push Back,我已经将这些函数添加到我的代码中,我的程序开始随机崩溃 SDL_2.exe中0x6C7B52E7(SDL2.dll)处未处理的异常:0xC0000005:访问冲突写入位置0xFF00000C。调试器显示了完全随机的代码片段,这些代码以前工作得很好,这让我想到,这些新函数会弄乱内存 void ObstacleSet::move() { Obstacles.push_back(Obstacle(mScreenWidth, mScreenHeight / 6 + 100, 10, 10, Coin,
void ObstacleSet::move()
{
Obstacles.push_back(Obstacle(mScreenWidth, mScreenHeight / 6 + 100, 10, 10, Coin, -29, 0));
Obstacles.push_back(Obstacle(mScreenWidth, mScreenHeight / 6 + 120, 10, 10, Coin, -29, 0));
Obstacles.push_back(Obstacle(mScreenWidth, mScreenHeight / 6 + 140, 10, 10, Coin, -29, 0));
Obstacles.push_back(Obstacle(mScreenWidth, mScreenHeight / 6 + 160, 10, 10, Coin, -29, 0));
Obstacles.push_back(Obstacle(mScreenWidth, mScreenHeight / 6 + 180, 10, 10, Coin, -29, 0));
for (auto &i : Obstacles)
{
i.move();
}
}
void ObstacleSet::outCheck(unsigned int &score)
{
for (unsigned int i = 0; i < getSize();)
{
if (getVelX(i) < 0 && (getX(i) + getW(i) <= 0))
{
eraseObstacle(i);
score++;
}
else if (getVelX(i) > 0 && (getX(i) >= mScreenWidth))
{
eraseObstacle(i);
score++;
}
else if (getVelY(i) > 0 && (getY(i) + getH(i) >= mScreenHeight))
{
eraseObstacle(i);
score++;
}
else if (getVelY(i) < 0 && (getY(i) <= 0))
{
eraseObstacle(i);
score++;
}
else
{
++i;
}
}
}
以下是ObstacleSet的一些功能
void ObstacleSet::eraseObstacle(int number)
{
unsigned N = number;
std::list<Obstacle>::iterator i = Obstacles.begin();
if (Obstacles.size() > N)
{
std::advance(i, N);
}
Obstacles.erase(i);
}
unsigned int ObstacleSet::getSize()
{
return Obstacles.size();
}
float ObstacleSet::getX(int number)
{
unsigned N = number;
std::list<Obstacle>::iterator i = Obstacles.begin();
if (Obstacles.size() > N)
{
std::advance(i, N);
}
return i->xPos;
}
std::list<Obstacle>::iterator ObstacleSet::getEnd()
{
return Obstacles.end();
}
void ObstacleSet::擦除障碍物(整数)
{
无符号N=数字;
std::list::iterator i=障碍物。begin();
如果(障碍物大小()>N)
{
标准:预付款(i,N);
}
障碍。清除(i);
}
unsigned int ObstacleSet::getSize()
{
返回障碍物。大小();
}
浮点对象集::getX(整数)
{
无符号N=数字;
std::list::iterator i=障碍物。begin();
如果(障碍物大小()>N)
{
标准:预付款(i,N);
}
返回i->xPos;
}
std::list::迭代器ObstacleSet::getEnd()
{
返回障碍。结束();
}
SDL初始化代码
bool init()
{
//Initialization flag
bool success = true;
//Initialize SDL
if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_JOYSTICK | SDL_INIT_AUDIO) < 0)
{
printf("SDL could not initialize! SDL Error: %s\n", SDL_GetError());
success = false;
}
else
//Set texture filtering to linear
if (!SDL_SetHint(SDL_HINT_RENDER_SCALE_QUALITY, "1"))
{
printf("Warning: Linear texture filtering not enabled!");
}
//Initialize SDL_mixer
if (Mix_OpenAudio(44100, MIX_DEFAULT_FORMAT, 2, 2048) < 0)
{
printf("SDL_mixer could not initialize! SDL_mixer Error: %s\n", Mix_GetError());
success = false;
}
//Check for joysticks
if (SDL_NumJoysticks() < 1)
{
printf("Warning: No joysticks connected!\n");
}
else
{
//Load joystick
gGameController = SDL_JoystickOpen(0);
if (gGameController == NULL)
{
printf("Warning: Unable to open game controller! SDL Error: %s\n", SDL_GetError());
}
}
//Create window
gWindow = SDL_CreateWindow("Jello demo", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, SCREEN_WIDTH, SCREEN_HEIGHT, SDL_WINDOW_SHOWN);
if (gWindow == NULL)
{
printf("Window could not be created! SDL Error: %s\n", SDL_GetError());
success = false;
}
else
{
//Create vsynced renderer for window
gRenderer = SDL_CreateRenderer(gWindow, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC);
if (gRenderer == NULL)
{
printf("Renderer could not be created! SDL Error: %s\n", SDL_GetError());
success = false;
}
else
//Initialize renderer color
SDL_SetRenderDrawColor(gRenderer, 0xFF, 0xFF, 0xFF, 0xFF);
//Initialize PNG loading
int imgFlags = IMG_INIT_PNG;
if (!(IMG_Init(imgFlags) & imgFlags))
{
printf("SDL_image could not initialize! SDL_image Error: %s\n", IMG_GetError());
success = false;
}
//Initialize SDL_ttf
if (TTF_Init() == -1)
{
printf("SSDL_ttf could not initialize! SDL_ttf Error: %s\n", TTF_GetError());
success = false;
}
}
return success;
}
bool init()
{
//初始化标志
布尔成功=真;
//初始化SDL
中频(SDL_初始(SDL_初始视频| SDL_初始操纵杆| SDL_初始音频)<0)
{
printf(“SDL无法初始化!SDL错误:%s\n”,SDL_GetError());
成功=错误;
}
其他的
//将纹理过滤设置为线性
如果(!SDL_SetHint(SDL_HINT_RENDER_SCALE_QUALITY,“1”))
{
printf(“警告:线性纹理过滤未启用!”);
}
//初始化SDL_混频器
if(Mix_OpenAudio(44100,Mix_默认格式,22048)<0)
{
printf(“SDL_混合器无法初始化!SDL_混合器错误:%s\n”,Mix_GetError());
成功=错误;
}
//检查操纵手柄
if(SDL_NumJoysticks()<1)
{
printf(“警告:未连接操纵手柄!\n”);
}
其他的
{
//装载操纵杆
gGameController=SDL_JoystickOpen(0);
if(gGameController==NULL)
{
printf(“警告:无法打开游戏控制器!SDL错误:%s\n”,SDL_GetError());
}
}
//创建窗口
gWindow=SDL_CreateWindow(“果冻演示”,SDL_WINDOWPOS_居中,SDL_WINDOWPOS_居中,屏幕宽度,屏幕高度,显示SDL_窗口);
if(gWindow==NULL)
{
printf(“无法创建窗口!SDL错误:%s\n”,SDL_GetError());
成功=错误;
}
其他的
{
//为窗口创建vsynced渲染器
gRenderer=SDL_CreateRenderer(gWindow,-1,SDL_RENDERER_加速| SDL_RENDERER_PRESENTVSYNC);
if(gRenderer==NULL)
{
printf(“无法创建渲染器!SDL错误:%s\n”,SDL_GetError());
成功=错误;
}
其他的
//初始化渲染器颜色
SDL_SetRenderDrawColor(灰色,0xFF,0xFF,0xFF,0xFF);
//初始化PNG加载
int imgFlags=IMG_INIT_PNG;
if(!(IMG_Init(imgFlags)和imgFlags))
{
printf(“SDL_映像无法初始化!SDL_映像错误:%s\n”,IMG_GetError());
成功=错误;
}
//初始化SDL\u ttf
如果(TTF_Init()=-1)
{
printf(“SSDL\u ttf无法初始化!SDL\u ttf错误:%s\n”,ttf\u GetError());
成功=错误;
}
}
回归成功;
}
可能是内存泄漏或指针悬空,但我找不到错误所在。如果有人能发现我错在哪里,我将非常高兴。如果您需要任何额外的代码块,请写信给我,除非您在某个地方有一个不变量,保证ObstacleSet不会调用空障碍列表中的任何内容,否则可能会出现问题 此代码在空列表中具有未定义的行为
float ObstacleSet::getX(int number)
{
unsigned N = number;
std::list<Obstacle>::iterator i = Obstacles.begin();
if (Obstacles.size() > N)
{
std::advance(i, N);
}
return i->xPos;
}
float ObstacleSet::getX(整数)
{
无符号N=数字;
std::list::iterator i=障碍物。begin();
如果(障碍物大小()>N)
{
标准:预付款(i,N);
}
返回i->xPos;
}
试图修复它
float ObstacleSet::getX(int number)
{
unsigned N = number;
std::list<Obstacle>::iterator i = Obstacles.begin();
if (Obstacles.size() > N)
{
std::advance(i, N);
}
if (i != Obstacles.end())
return i->xPos;
// handle empty
return ERRORPOS; // or throw or assert or ...
}
float ObstacleSet::getX(整数)
{
无符号N=数字;
std::list::iterator i=障碍物。begin();
如果(障碍物大小()>N)
{
标准:预付款(i,N);
}
如果(i!=障碍物。结束())
返回i->xPos;
//空句柄
返回ERRORPOS;//或抛出或断言或。。。
}
与访问列表的所有其他函数相同。我在代码中看到一些问题:
ObstacleSet::move()
中,您在列表中添加了五个障碍。看起来列表可能会无限增长,导致内存溢出擦除障碍物()
、getX()
以及可能在您尚未显示的其他函数中,您不会检查障碍物是否为空
显然,我提供的代码中没有错误。我错误地初始化了SDL_混合器。我像这样加载音频
if(Mix\u OpenAudio(44100,Mix\u DEFAULT\u格式,2208)<0)
,但我提供的wav文件的采样率不是Mix\u DEFAULT\u格式,即22050。
无论如何,感谢所有人,他们试图帮助我编写代码。第一次使用stackoverflow是一次愉快的体验。您是否尝试过使用调试器并单步执行代码以查看程序在哪一行中断?能否向我们展示您的SDL初始化代码?@MigaraLiyanagamage调试器显示了完全随机的代码片段,这些代码以前工作得非常好,这让我想到,新函数会弄乱内存。@Brett代码添加到Post中。这是一个大量的代码,请尝试生成@Diversity,要么我需要更多睡眠,要么这个注释不是为我准备的。@Surf用答案替换了注释
bool init()
{
//Initialization flag
bool success = true;
//Initialize SDL
if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_JOYSTICK | SDL_INIT_AUDIO) < 0)
{
printf("SDL could not initialize! SDL Error: %s\n", SDL_GetError());
success = false;
}
else
//Set texture filtering to linear
if (!SDL_SetHint(SDL_HINT_RENDER_SCALE_QUALITY, "1"))
{
printf("Warning: Linear texture filtering not enabled!");
}
//Initialize SDL_mixer
if (Mix_OpenAudio(44100, MIX_DEFAULT_FORMAT, 2, 2048) < 0)
{
printf("SDL_mixer could not initialize! SDL_mixer Error: %s\n", Mix_GetError());
success = false;
}
//Check for joysticks
if (SDL_NumJoysticks() < 1)
{
printf("Warning: No joysticks connected!\n");
}
else
{
//Load joystick
gGameController = SDL_JoystickOpen(0);
if (gGameController == NULL)
{
printf("Warning: Unable to open game controller! SDL Error: %s\n", SDL_GetError());
}
}
//Create window
gWindow = SDL_CreateWindow("Jello demo", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, SCREEN_WIDTH, SCREEN_HEIGHT, SDL_WINDOW_SHOWN);
if (gWindow == NULL)
{
printf("Window could not be created! SDL Error: %s\n", SDL_GetError());
success = false;
}
else
{
//Create vsynced renderer for window
gRenderer = SDL_CreateRenderer(gWindow, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC);
if (gRenderer == NULL)
{
printf("Renderer could not be created! SDL Error: %s\n", SDL_GetError());
success = false;
}
else
//Initialize renderer color
SDL_SetRenderDrawColor(gRenderer, 0xFF, 0xFF, 0xFF, 0xFF);
//Initialize PNG loading
int imgFlags = IMG_INIT_PNG;
if (!(IMG_Init(imgFlags) & imgFlags))
{
printf("SDL_image could not initialize! SDL_image Error: %s\n", IMG_GetError());
success = false;
}
//Initialize SDL_ttf
if (TTF_Init() == -1)
{
printf("SSDL_ttf could not initialize! SDL_ttf Error: %s\n", TTF_GetError());
success = false;
}
}
return success;
}
float ObstacleSet::getX(int number)
{
unsigned N = number;
std::list<Obstacle>::iterator i = Obstacles.begin();
if (Obstacles.size() > N)
{
std::advance(i, N);
}
return i->xPos;
}
float ObstacleSet::getX(int number)
{
unsigned N = number;
std::list<Obstacle>::iterator i = Obstacles.begin();
if (Obstacles.size() > N)
{
std::advance(i, N);
}
if (i != Obstacles.end())
return i->xPos;
// handle empty
return ERRORPOS; // or throw or assert or ...
}