C+中的Valgrind错误+;三维阵列 在理解ValgRAND错误时,我会遇到困难,编译一个C++程序来创建和管理一个3D数组。p>
我在我的Mac电脑上编写了软件,一切看起来都很好,但是当我把它移植到Ubuntu上时,我不仅得到了Valgrind错误,输出结果也与Mac电脑中的不同(而且是错误的) 以下是Valgrind错误:C+中的Valgrind错误+;三维阵列 在理解ValgRAND错误时,我会遇到困难,编译一个C++程序来创建和管理一个3D数组。p>,c++,valgrind,C++,Valgrind,我在我的Mac电脑上编写了软件,一切看起来都很好,但是当我把它移植到Ubuntu上时,我不仅得到了Valgrind错误,输出结果也与Mac电脑中的不同(而且是错误的) 以下是Valgrind错误: ==10705== Invalid write of size 4 ==10705== at 0x401095: Matrice3D<int>::Matrice3D(unsigned int, unsigned int, unsigned int, int const&) (
==10705== Invalid write of size 4
==10705== at 0x401095: Matrice3D<int>::Matrice3D(unsigned int, unsigned int, unsigned int, int const&) (in /media/psf/sharedFolder/Progetto_2/main.exe)
==10705== by 0x400BE1: main (in /media/psf/sharedFolder/Progetto_2/main.exe)
==10705== Address 0x5ab6e10 is 0 bytes after a block of size 192 alloc'd
==10705== at 0x4C2E80F: operator new[](unsigned long) (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==10705== by 0x40102E: Matrice3D<int>::Matrice3D(unsigned int, unsigned int, unsigned int, int const&) (in /media/psf/sharedFolder/Progetto_2/main.exe)
==10705== by 0x400BE1: main (in /media/psf/sharedFolder/Progetto_2/main.exe)
==10705==
--10705-- VALGRIND INTERNAL ERROR: Valgrind received a signal 11 (SIGSEGV) - exiting
--10705-- si_code=1; Faulting address: 0x1105AB6E38; sp: 0x802ca9e30
==10705==大小为4的无效写入
==10705==at 0x401095:Matrice3D::Matrice3D(无符号整数、无符号整数、无符号整数、整数常量&)(在/media/psf/sharedFolder/Progetto_2/main.exe中)
==10705==0x400BE1:main(在/media/psf/sharedFolder/Progetto_2/main.exe中)
==10705==地址0x5ab6e10是分配大小为192的块后的0字节
==10705==at 0x4C2E80F:operator new[](无符号长)(in/usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==10705==by 0x40102E:Matrice3D::Matrice3D(无符号整数、无符号整数、无符号整数、整数常量&)(在/media/psf/sharedFolder/Progetto_2/main.exe中)
==10705==0x400BE1:main(在/media/psf/sharedFolder/Progetto_2/main.exe中)
==10705==
--10705--VALGRIND内部错误:VALGRIND收到信号11(SIGSEGV)-退出
--10705——si_代码=1;故障地址:0x1105AB6E38;sp:0x802ca9e30
建造商提到:
Matrice3D(unsigned int height, unsigned int width, unsigned int depth, const T &value) : _3D_matrix(0), _height(0), _width(0), _depth(0) {
try {
_3D_matrix = new T[height * width * depth];
for (int z = 0; z < depth; z++) {
for (int j = 0; j < height; j++) {
for (int k = 0; k < width; k++) {
_3D_matrix[j * height * depth + k * depth + z] = value;
}
}
}
}
catch(...) {
delete[] _3D_matrix;
throw;
}
_height = height;
_width = width;
_depth = depth;
}
Matrice3D(无符号整数高度、无符号整数宽度、无符号整数深度、常数和值):\u3D\uMatrix(0),\uHeight(0),\uWidth(0),\uDepth(0){
试一试{
_3D_矩阵=新T[高度*宽度*深度];
对于(intz=0;z
有没有人有过类似的经历?我做错什么了吗?
提前谢谢 似乎写入问题是由于混合了级别的各种
的范围/索引造成的:
_3D_matrix[j * height * depth + k * depth + z] = value;
请看这里:-您的代码移动到一个独立的函数中,并添加了索引输出。输出显示一些索引被分配了两次(例如,在本例中为22),一些索引从未被分配(如63)。索引的顺序看起来很奇怪,很难解释
可能宽度、高度和深度的某些组合会导致您注意到的错误
我建议简化fors变量(使“row”表示一行,而不是其他内容),使用std::array
或简单地使用一维数组,自己实现行、列和深度。您的索引计算是错误的
z
从0
到depth
j
从0
到高度
k
从0
变为width
到目前为止还不错(嗯,j
和k
而不是x
和y
是不寻常的,可能是混淆的一部分)。但是:
将j
乘以height
是错误的,它可能应该是width
考虑这种情况:<代码> j=身高- 1 < /代码>,<代码> k=0 < /代码>,<代码> z=0 < /代码>。那么您的索引将是height*depth*(height-1)
,如果height
与width
不同,这显然是不正确的
< >调试这样的情况的一个窍门,你对数组索引不确定是考虑极端情况。如果您考虑上述情况(或所有循环变量都是最大的情况),您将立即看到索引可能超过数组大小。您没有对底层存储使用std::vector
。这是错误的。catch
这件事就是错误的。这个三级循环可以简化为for(size\u t i{};(height*width*depth)!=i;++i){u 3D\u matrix[i]=value;}
现有的索引似乎很奇怪。@chearsandhth.-Alf不幸的是,我不能使用std::vector或类似的东西。非常感谢ideone链接,它帮助我认识到问题所在。我根据我在纸上画的草图对这3个嵌套循环进行了编码,我认为这会奏效。我现在要试着把它修好!谢谢!将高度
更改为宽度
解决了问题!
_3D_matrix[j * height * depth + k * depth + z] = value;