删除分配的两个d数组

时间:2012-12-13 14:55:34

标签: c++ arrays memory-management segmentation-fault

我正在尝试在运行时分配二维数组。阵列的大小是N * N,其中N是由用户输入的。 最后我删除了分配的内存。但我得到了分段错误。 我知道当我尝试访问未由我分配的内存时会发生分段错误。请帮助代码如下:

#include<iostream>
using namespace std;
#include <stdio.h>

int main ()
{
    int t,n;
    int **judge;
    int **result;
    int i,j,l;
    int high;
    float count;
    int item;
    cin>>t;
    while(t-->0)
    {
        cin>>n;
        judge=new int*[n];result=new int*[n];
        for(i=0;i<n;i++)
        {
            judge[i]=new int[n];
            result[i]=new int[n];
        }

        for(i=0;i<n;i++)
        {
            for(j=0;j<n;j++)
            {
                cin>>judge[i][j];
            }
        }
        count=0;
        result[0][0]=0;
        for(i=0;i<n;i++)
        {
            for(j=0;j<n;j++)
            {
                item=0;
                if(j>0&&i>0)
                {
                if(item<result[i][j-1])
                    item=result[i][j-1];
                else if(item<result[i-1][j])
                    item=result[i-1][j];
                }
                else if(i==0)
                {
                    if(item<result[i][j-1])
                        item=result[i][j-1];
                }
                else if(j==0)
                {
                    if(item<result[i-1][j])
                        item=result[i-1][j];
                }

                result[i][j]=judge[i][j]+item;
            }
        }

        if(result[n-1][n-1]<0.0)
            cout<<"Bad Judges"<<endl;
        else
        {
            count=(result[n-1][n-1]/(float)n);
            cout<<count<<endl;
        }

        for( i = 0 ; i < n  ; ++i)
        {
            delete[] result[i] ;
        }
        delete[] result;
        for(i = 0 ; i < n ; ++i)
        {
            delete[] judge[i] ;
        }
        delete[] judge;
        /* for(i=0;i<n;i++)
        {
            delete[] judge[i];
            delete[] result[i];       
        }*/
        // delete[] judge;
        //delete[] result;
    } 
}

2 个答案:

答案 0 :(得分:3)

你循环judge直到n+2并且你没有分配那么多。

在这三行中:

for(int i = 0 ; i < n + 2 ; ++i)
{
   delete[] judge[i] ;
}

顺便说一下,这不是您唯一一次访问未分配的内存:

for(i=1;i<n+1;i++)
{
   for(j=1;j<n+1;j++)
   {
     cin>>judge[i][j];
   }
}

此处ij最多可达n,而您的分配最多允许n -1

答案 1 :(得分:0)

有很多循环,比如

for(i=1;i<n+1;i++)

在C ++中,数组从0开始索引,因此您应该使用[0..n)而不是

for(i=0;i<n;i++)