2014-09-30 53 views
0

所以我在删除3D阵列时遇到了问题。它似乎在我的代码中导致分段错误。这是我的。分段错误是由3D数组的删除引起的,但我不知道为什么。删除3D阵列导致分段错误

int main(int argc, char** argv) 
{ 
    //variables 
    ifstream inputFileStream[ argc - 2 ]; 
    int ***dimensions; 

    //open inputFileStream and read in values... 

    //creating the dynamic 3D array and reading in grey values 
    dimensions = new int**[ argc - 2 ]; 
    for(int i = 0; i < argc - 2; i++) 
    { 
     dimensions[ i ] = new int*[ width ]; 
     for(int j = 0; j < width; j++) 
     { 
      dimensions[ i ][ j ] = new int[ height ]; 
      for(int k = 0; k < height; k++) 
      { 
       inputFileStream[ i ] >> dimensions[ i ][ j ][ k ]; 
      } 
     } 
    } 

    //do something with array 

    //delete array 
    for(int i = 0; i < width; i++) 
    { 
     for(int j = 0; j < height; j++) 
     { 
      delete[] dimensions[ i ][ j ]; 
     } 
     delete[] dimensions[ i ];   
    } 
    delete[] dimensions; 
} 
+0

'width'的值是什么? – streppel 2014-09-30 18:12:04

+0

您是否在其他地方删除阵列?这可以删除指针的副本,不必是实际的“维度”指针。 – 2014-09-30 18:20:01

+0

我不会删除任何其他地方的数组。宽度的值因您输入的文件而异,但在这种情况下为495 – 2014-09-30 18:29:04

回答

1

分配时,你的“i”值从0变为“的argc-2”,你“J”值从0变为“宽度”,和你的“K”值对应于“高度”。删除时,您的'我'值从0到'宽度',并且您的'j'值从0到'高度'。但是,在这两种情况下,您都可以使用[i] [j]进行索引。这不一致。

0

这里是一个代码完整,但简化的例子,工程:

int main(int argc, char** argv) 
{ 
    //variables 
    int ***dimensions; 

    //creating the dynamic 3D array and reading in grey values 
    dimensions = new int**[ 10 ]; 
    int width = 10; 
    int height = 20; 
    for(int i = 0; i < 10; i++) 
    { 
     dimensions[ i ] = new int*[ width ]; 
     for(int j = 0; j < width; j++) 
      dimensions[ i ][ j ] = new int[ height ]; 
    } 

    for(int i = 0; i < 10; i++) 
    { 
     for(int j = 0; j < width; j++) 
      delete[] dimensions[ i ][ j ]; 
     delete[] dimensions[ i ];   
    } 
    delete[] dimensions; 
} 

正如你可以看到,环超过10widthheight在循环逻辑中不起作用。所以问题在于你失去了如何展开三维的轨迹,错误地使用height作为内部循环约束。