C ++ 3D数组中的Valgrind错误

时间:2018-05-23 10:40:34

标签: c++ valgrind

我很难理解Valgrind错误,显示编译C ++程序以创建和管理3D数组。

我在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&) (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

和构造函数引用:

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;

    }

任何人都有类似的经历吗?难道我做错了什么? 提前谢谢!

2 个答案:

答案 0 :(得分:2)

看起来写的问题是由混合各种for级别的范围/索引引起的:

_3D_matrix[j * height * depth + k * depth + z] = value;

看看这里:https://ideone.com/gkUXib - 你的代码移入了一个带有附加索引输出的独立函数。输出显示一些索引被分配两次(即示例中为22),一些从未分配给(如63)。索引的顺序看起来很奇怪,很难推理。

可能宽度,高度和深度的某种组合可能会导致您注意到的错误。

我建议简化fors变量(使“行”表示行,而不是其他),使用std::array或只使用单维数组并自己实现行,列和深度。 / p>

答案 1 :(得分:1)

您的索引计算错误。

z0转到depth j0转到height k0转到width

到目前为止一切顺利(好jk而不是xy是不寻常的,可能是混乱的一个很好的部分)。但是:

_3D_matrix[j * height * depth + k * depth + z] = value;

j乘以height是错误的,应该是width
考虑这种情况:j = height - 1k = 0z = 0。那么您的索引将为height * depth * (height - 1),如果heightwidth不同,则显然不正确。

调试这种不确定数组索引的情况的技巧是考虑极端情况。如果您考虑上述情况(或所有循环变量都是最大的情况),您将立即看到您的索引可能超出您的数组大小。