c++中vector在尝试push_back实例时出现奇怪的错误
Weird error with vectors in C++ when trying to push_back an instance
我想做一个push_back
,但Code::Blocks给我发送了一个奇怪的错误。我已经调试了这段代码很多很多次,但我不能识别错误。方法LoadFromConsole
与误差相符。
特别是当我经过m_blocks.pushback(blocks)
行时发生错误。我将粘贴一些类。如果你需要更多的类来帮助我,我将粘贴剩下的代码。谢谢你。
class Block{
int m_left;
int m_top;
int m_right;
int m_bottom;
public:
Block();
void set_values(int,int,int,int);
void loadFromFile(ifstream*f);
void loadFromConsole(int x,int y, int z, int w);
int getValue(int side);
void print();
};
void Block::set_values(int izq,int arriba,int der,int abajo){
m_top = arriba;
m_left = izq;
m_bottom = abajo;
m_right = der;
}
class Board{
uint64_t m_timer;
int m_step;
int m_width;
int m_height;
vector<Block> m_blocks;
bool solveState(State*state);
bool isValid(State*state);
bool isValidSide(State*state,int cell,int side,int cell1,int side1);
bool isValidSideImplementation(State*state,int cell,int side,int cell1,int side1);
void printState(State*state);
public:
Board();
void loadFromFile(ifstream*file);
void loadFromConsole(int FIL, int COL);
void solve();
};
void Board::loadFromConsole(int FIL,int COL ){
m_height = FIL;
m_width = COL;
srand(time(0));
matriz = new int*[COL];
for (int i = 0; i < FIL; i++){
matriz[i] = new int[COL];
}
matriz[0][0] = rand()%8+1;
matriz[0][1] = rand()%8+1;
matriz[0][2] = rand()%8+1;
matriz[0][3] = rand()%8+1;
for (int i = 1; i < m_width; i++){
matriz[i][0] = rand()%8+1;
matriz[i][1] = matriz[i-1][2];
matriz[i][2] = rand()%8+1;
matriz[i][3] = rand()%8+1;
}
for (int j = 4; j < m_width*4; j+=4){
matriz[0][j] = matriz[0][j-1];
matriz[0][j+1] = rand()%8+1;
matriz[0][j+2] = rand()%8+1;
matriz[0][j+3] = rand()%8+1;
}
for (int i = 1; i < m_width; i++ ){
for (int j = 4; j < (m_width*4); j+=4){
matriz[i][j] = matriz[i][j-1];
matriz[i][j+1] = matriz[i-1][j+1];
matriz[i][j+2] = rand()%8+1;
matriz[i][j+3] = rand()%8+1;
}
}
for(int i=0;i<m_height;i++){
for(int j=0;j< (m_width*4);j+=4){
Block block;
block.print();
m_blocks.push_back(block);
}
}
}
关于:
matriz = new int*[COL];
for (int i = 0; i < FIL; i++){
matriz[i] = new int[COL];
}
我认为第一个new
应该使用FIL
而不是COL
。
否则你创建的是一个COL x COL
矩阵,而不是FIL x COL
矩阵,因此你很可能在接下来的作业中书写超出了矩阵的末尾,特别是当COL
小于FIL
时。
此外,这段代码显然超出了矩阵的边界,并且似乎使用width
来引导,而它应该使用height
:
for (int i = 1; i < m_width; i++ ){
for (int j = 4; j < m_width*4; j+=4){
matriz[i][j] = matriz[i][j-1];
在这里乘以4是不必要的,这会导致您读取/写入超出数组末尾的索引,从而调用未定义的行为。具体来说,如您所说,如果FIL
和COL
是相同的值,则访问m_width
及以上元素的事实是不正确的。
你的程序有未定义行为。你在读取和覆盖不属于你的记忆。这两个循环计数器远远超过了允许索引到所有数据行的底层内存分配:
// this is wrong. it will far-exceed the allocated
// size of matrix[0], which is m_width int vals
for (int j = 4; j < m_width*4; j+=4){
matriz[0][j] = matriz[0][j-1];
matriz[0][j+1] = rand()%8+1;
matriz[0][j+2] = rand()%8+1;
matriz[0][j+3] = rand()%8+1;
}
后来…
// Note:this is also wrong. it should be using m_height
for (int i = 1; i < m_width; i++ )
{
// this is wrong. same problem as the other j-loop
for (int j = 4; j < (m_width*4); j+=4){
matriz[i][j] = matriz[i][j-1];
matriz[i][j+1] = matriz[i-1][j+1];
matriz[i][j+2] = rand()%8+1;
matriz[i][j+3] = rand()%8+1;
}
}
在两个j
循环中,你以4的增量枚举,直到(m_width-1)*4
。假设COL
作为10
传入。枚举将是:
4, 8, 12, 16, 20, 24, 28, 32, 36
^^^^^^^^^^^^^^^^^^^^^^^^^^ ALL OUTSIDE ALLOCATED RANGE
^^^ OUTSIDE ALLOCATED RANGE FOR [j+2] and [j+3]
考虑将每一行分配为:
for (int i = 0; i < FIL; i++)
matriz[i] = new int[COL]; // << always smaller than
// 4*(COL-1) unless COL is 1
相关文章:
- 多个文件的内存分配错误"在抛出 'std :: bad_alloc' what (): std :: bad_alloc 的实例后终止调用" [C++]
- 我收到以下错误:抛出'std::bad_alloc'实例后终止调用
- 为什么包含windows.h会产生语法错误,从而阻止类的实例化?(C2146,C2065)
- 为什么创建友元类的实例会导致"undefined reference to"错误?
- 错误 没有与参数列表匹配的重载函数"getline"实例
- 错误的cv::face FacemarkLBF实例化
- C++应用程序 MySQL odbc 数据库连接错误:在引发"otl_tmpl_exception<>"实例后终止调用
- 无法使用 SWIG 在 Python 中实例化C++类(获取属性错误)
- 在抛出 'std::runtime_error' 的实例后终止调用 what(): Filebuf 和 ostream 的 I/O 错误
- gcc出现不明确的模板实例化错误
- 结构数组的构造函数错误,错误消息:没有构造函数实例与参数列表匹配
- 尝试实例化模板类的对象时出现"No Matching Constructor"错误
- 返回实例变量的c++方法可以访问变量中的数据,但不能更改它,但在编译时不会生成错误
- 使用to_string、reverse、stoi组合的C++反转编号给出运行时错误实例超出范围
- 无法实例化抽象类错误
- C++ Visual Studio 重载函数错误:没有重载函数的实例与指定的类型匹配
- 错误 C2280 / 在 std::vector 中实例化对象时复制构造函数出现问题?
- 为什么自删除的全局 Vulkan 实例仅在添加层时才导致段错误?
- "if (argc < 2 || argc > 2)"应该有 2 个参数吗?&终止在抛出'std::out_of_range'错误实例后调用
- 包含iostream时的自定义类时间的错误实例