我想举一个最简单的例子。如果提供的代码不够,请告诉我你还需要什么。这没有什么超级秘密;)C++ 3D数组到1D会导致堆缓冲区溢出
考虑以下两种实现方式:
使用三维数组:
.H
class Grid
{
public:
Grid();
uint8_t get(int x, int y, int z);
void set(int x, int y, int z, uint8_t value);
private:
uint8_t blocks[Chunk::width][Chunk::height][Chunk::depth];
};
的.cpp
Grid::Grid()
{
memset(blocks, 0, sizeof(blocks));
}
uint8_t Grid::get(int x, int y, int z)
{
return blocks[x][y][z];
}
void Grid::set(int x, int y, int z, uint8_t value)
{
blocks[x][y][z] = value;
}
现在一维数组:
.H
class Grid
{
public:
Grid();
uint8_t get(int x, int y, int z);
void set(int x, int y, int z, uint8_t value);
private:
uint8_t blocks[Chunk::width * Chunk::height * Chunk::depth];
int to1D(int x, int y, int z) { return x + (y * Chunk::width) + (z * Chunk::width * Chunk::height); }
};
的.cpp
Grid::Grid()
{
memset(blocks, 0, sizeof(blocks));
}
uint8_t Grid::get(int x, int y, int z)
{
return this->blocks[x + (y * Chunk::width) + (z * Chunk::width * Chunk::height)];
}
void Grid::set(int x, int y, int z, uint8_t value)
{
this->blocks[x + (y * Chunk::width) + (z * Chunk::width * Chunk::height)] = value;
}
现在有了3D版的一切工作就像一个魅力,同时为相同的整体尺寸我得到一个
摘要: AddressSanitizer:堆缓冲区溢出src/Grid.cpp:16在Grid :: get(int,int,int)中
我真的很想知道为什么。两种实现都支持uint8_t
s ...在3D数组版本中进行的优化是什么,我似乎无法看到/掌握?
(是的,这是一个minecrafty素引擎实验;))
宽度,高度和深度的值是多大? – Ronin
在@Ronin上跟进,你的代码崩溃的小值x/y/z? – siavashk
你从来没有说过你要调用'Grid :: get'的值。 – PaulMcKenzie