我想舉一個最簡單的例子。如果提供的代碼不夠,請告訴我你還需要什麼。這沒有什麼超級祕密;)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