gpt4 book ai didi

C++ std::vector 迭代器错误

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:26:16 24 4
gpt4 key购买 nike

首先,我很抱歉我的英语不好,希望你们能理解我:) 我正在编写 WinAPI 游戏,我的类表现得很奇怪:所有操作都使用 vector使我的程序崩溃所以 Windows 说我的 .exe 停止工作。但是当我调试这些行时我得到异常。

这是我的类标题的样子:

#ifndef FIGURE_H_INCLUDED
#define FIGURE_H_INCLUDED

#include <vector>
#include <Windows.h>
#include "Other.h"

using namespace std;

enum Figure_Type { I, J, L, O, S, T, Z };

class Figure
{
public:
/* CONSTRUCTORS */
Figure();
Figure(Figure_Type);

/* MOVEMENT */
bool Move(vector<Cell>&, Direction&);
void Drop(vector<Cell>&);
bool Rotate(vector<Cell>&);

/* OTHER */
void Draw(HDC&);

private:

/* METHODS */
void Generate();
void GenerateMasks();
void GenerateFigure();
Figure GetFigureCopy() const;

/* DATA */
Shift shift;
char mask[4][4];
vector<Cell> vCells;
Figure_Type type;
int rotation;
};

#endif

我的构造函数正在使用 Generate() 方法,代码是:

void Figure::GenerateFigure()
{
vCells.clear();
int defPosX = 4,
defPosY = 20;
Cell cell;

for(int y = 0; y < 4; y++)
{
for(int x = 0; x < 4; x++)
{
if(mask[y][x] == '0')
{
cell.x = defPosX + x + shift.dx;
cell.y = defPosY - y + shift.dy;
vCells.push_back(cell);
}
}
}
}

而且我在 vCells.clear() 方法和(如果我评论第一行)vCells.push_back(cell) 行上遇到异常。实际上,使用 vector/vector 迭代器的每个操作都会使我的程序崩溃,甚至递增迭代器,这些只是第一个,所以我的代码在它们之后不再运行。异常文本:

“Tetris_completely_new.exe 中 0x5A4ACCD2 (msvcp110d.dll) 处的未处理异常:0xC000041D:在用户回调期间遇到未处理的异常。”

并且这些异常是在 217 的“xutility”行中抛出的。我评论它:

....
// MEMBER FUNCTIONS FOR _Container_base12
inline void _Container_base12::_Orphan_all()
{ // orphan all iterators
#if _ITERATOR_DEBUG_LEVEL == 2
if (_Myproxy != 0)
{ // proxy allocated, drain it
_Lockit _Lock(_LOCK_DEBUG);

for (_Iterator_base12 **_Pnext = &_Myproxy->_Myfirstiter;
*_Pnext != 0; *_Pnext = (*_Pnext)->_Mynextiter)
**(*_Pnext)->_Myproxy = 0;** // <------------ THIS LINE
_Myproxy->_Myfirstiter = 0;
}
#endif /* _ITERATOR_DEBUG_LEVEL == 2 */
}
....

这是我的单元格结构的样子:

struct Cell
{
Cell() : x(1), y(1) { }
Cell(int _x, int _y): x(_x), y(_y) { }

void Draw(HDC&) const;

bool operator ==(const Cell& a) const { return (x == a.x && y == a.y); }
bool operator !=(const Cell& a) const { return !(*this == a); }

int x;
int y;
};

图形构造函数:

Figure::Figure()
{
srand(time(NULL));

vCells.clear();
type = Figure_Type(rand() % 7);
rotation = 0;
shift.dx = 0;
shift.dy = 0;

Generate();
}

最佳答案

您可能会调用未定义的行为。

如果没有更多信息,我会说您正在通过陈旧的对象引用/指针调用实例方法(在回调注册时获取的引用不再有效?)。

此外,正如目前问题中所写,您正在根据 mask 中的未初始化字节生成一个图形,因此您可能也想初始化它们。

这是一个稍微现代化/清理过的版本。注意

  • 初始化列表的使用
  • 统一初始化
  • 重新排序成员初始化
  • 不在 header 中使用using namespace
  • srand 移动到 main 而不是构造函数

查看Live on Coliru

#ifndef FIGURE_H_INCLUDED
#define FIGURE_H_INCLUDED

#include <vector>

#ifdef _WIN32
# include <Windows.h>
# include "Other.h"
#else
# include <cstdint>
# include <cstdlib>
# include <ctime>

using HDC = uint32_t;
#endif

struct Cell
{
Cell(int _x=1, int _y=1): x(_x), y(_y) { }

void Draw(HDC&) const;

bool operator ==(const Cell& a) const { return (x == a.x && y == a.y); }
bool operator !=(const Cell& a) const { return !(*this == a); }

int x;
int y;
};

struct Shift
{
Shift(int dx=0, int dy=0) : dx(dx), dy(dy) {}
int dx, dy;
};

enum class Direction
{
up, down, left, right
};

enum Figure_Type { I, J, L, O, S, T, Z };

class Figure
{
public:
/* CONSTRUCTORS */
Figure();
Figure(Figure_Type);

/* MOVEMENT */
bool Move(std::vector<Cell>&, Direction&);
void Drop(std::vector<Cell>&);
bool Rotate(std::vector<Cell>&);

/* OTHER */
void Draw(HDC&);

private:

/* METHODS */
void Generate();
void GenerateMasks();
void GenerateFigure();
Figure GetFigureCopy() const;

/* DATA */
char mask[4][4];
std::vector<Cell> vCells;
Figure_Type type;
int rotation;
Shift shift;
};

#endif

/*
* And I'm getting exceptions on vCells.clear() method and (if I comment first
* line) vCells.push_back(cell) line. Actually every operation with vector /
* vector iterators crash my program even incrementing iterator, those are just
* the first so my code isn't running any longer after them.
*
* Exception text:
* **"Unhandled exception at 0x5A4ACCD2 (msvcp110d.dll) in
* Tetris_completely_new.exe: 0xC000041D: An unhandled exception was
* encountered during a user callback."**
*
* And these exceptions are thrown on 217's line of "xutility". I commented it:
*
* ....
* // MEMBER FUNCTIONS FOR _Container_base12
* inline void _Container_base12::_Orphan_all()
* { // orphan all iterators
* #if _ITERATOR_DEBUG_LEVEL == 2
* if (_Myproxy != 0)
* { // proxy allocated, drain it
* _Lockit _Lock(_LOCK_DEBUG);
*
* for (_Iterator_base12 **_Pnext = &_Myproxy->_Myfirstiter;
* *_Pnext != 0; *_Pnext = (*_Pnext)->_Mynextiter)
* **(*_Pnext)->_Myproxy = 0;** // <------------ THIS LINE
* _Myproxy->_Myfirstiter = 0;
* }
* #endif // _ITERATOR_DEBUG_LEVEL == 2
* }
* ....
*
* Here is how my **Cell struct** looks like:
*/

//And **Figure constructor**:

Figure::Figure()
: mask {{0}},
vCells(),
type((Figure_Type) (rand() % 7)),
rotation(0),
shift({0,0})
{
Generate();
}

//My constructors are using Generate() method, which code is:
void Figure::Generate()
{
GenerateFigure();
}

void Figure::GenerateFigure()
{
vCells.clear();
for(int y = 0; y < 4; y++) {
for(int x = 0; x < 4; x++) {
if(mask[y][x] == '0')
vCells.push_back({4 + x + shift.dx, 20 - y + shift.dy});
}
}
}

int main()
{
srand(time(0));
Figure fig1;
Figure fig2;
}

关于C++ std::vector 迭代器错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18942601/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com