Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/silverlight/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C+中的Valgrind错误+;三维阵列 在理解ValgRAND错误时,我会遇到困难,编译一个C++程序来创建和管理一个3D数组。p>_C++_Valgrind - Fatal编程技术网

C+中的Valgrind错误+;三维阵列 在理解ValgRAND错误时,我会遇到困难,编译一个C++程序来创建和管理一个3D数组。p>

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

我在我的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
==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;