C ++中的STATUS_ACCESS_VIOLATION

时间:2014-03-16 21:03:17

标签: c++ stack

这是我的代码。当我不使用" POPSELF"它正确​​运行阵列。但是当我使用它时 我收到以下错误: ' 47 [main] QCL 1581244 open_stackdumpfile:将堆栈跟踪转储到QCL.exe.stackdump'

为什么它给我这样的错误?

 // Declaring functions
 void license(); void Hamiltonian(double**,double*,double*,double*,double*,int,double&);
 void NEGF(complex<double>****,double**,double*,
        double*,double*,double*,double&,int,int,int,double,double);
// Global Variables
int main() {
    license();
    int n_Z ,n_E , n_K; double _Volt , _Temp ;
    GetParams Init ;  // Set Input Parameters
    Init.SetParams() ;
    n_Z = Init.Get_nZ() ;
    n_E = Init.Get_nE() ;
    n_K = Init.Get_nK() ;
    _Volt = Init.Get_Volt() ;
    _Temp = Init.Get_Temp() ;


    int ii=0 ,kk=0 ,xx=0; double *EnergyX ; double *PeriodX ;
    double *mstar; double *deltaU; double **Ham0;
    double *EpsDC; double *EpsAC; double dZ=0; ;
    EnergyX = new double [n_E] ; PeriodX = new double [n_Z];
    mstar = new double [n_Z] ; EpsDC = new double [n_Z];
    deltaU = new double [n_Z] ; EpsAC = new double [n_Z];
    Ham0 = new double *[n_Z];
    for(ii = 0; ii <n_Z; ii++)
    Ham0[ii] = new double[n_Z];

    Hamiltonian(Ham0,mstar,deltaU,EpsDC,EpsAC,n_Z,dZ) ;

    // NEGF
    complex<double> ****Gn= new complex<double> ***[n_Z];
    complex<double> ****POPSELF= new complex<double> ***[n_Z];
    for(ii=0;ii<n_Z;ii++)
        Gn[ii] = new complex<double> **[n_Z] ;
        POPSELF[ii] = new complex<double> **[n_Z] ;
        for(ii=0;ii<n_Z;ii++){
            for(kk=0;kk<n_Z;kk++){
                Gn[ii][kk] = new complex<double> *[n_K] ;
                POPSELF[ii][kk] = new complex<double> *[n_K] ;
            }
        }
        for(ii=0;ii<n_Z;ii++){
            for(kk=0;kk<n_Z;kk++){
                for(xx=0;xx<n_K;xx++){
                    Gn[ii][kk][xx]= new complex<double> [n_E] ;
                    POPSELF[ii][kk][xx]= new complex<double> [n_E] ;
                }
            }
        }

        NEGF(Gn,Ham0,mstar,EnergyX,PeriodX,deltaU,dZ,n_K,n_E,n_Z,_Volt,_Temp) ;

    return 0;
}

1 个答案:

答案 0 :(得分:3)

我想建议一种更好的方式来声明和使用4D数组:

std::vector< complex<double> > POPSELF(n_Z*n_Z*n_K*n_E);

或至少:

complex<double> *POPSELF = new complex<double> [n_Z*n_Z*n_K*n_E];

然后,作为i,j,k,l各自的索引,您可以参考以下元素:

POPSELF[l + k*n_E + j*n_E*n_K + i*n_E*n_K*n_Z ]

这有点长,但是使用C ++,您可以将这些内容封装在Matrix4D类中,并将operator()定义为:

complex<double> &operator()(int i, int j, int k, int l) {
    return POPSELF[l + k*n_E + j*n_E*n_K + i*n_E*n_K*n_Z ];
}

这是处理具有科学计算的动态多维矩阵时的正确方法,也更有效 - 比数组数组(数组数组!)对缓存和预取器更友好。< / p>

最后我要说我发现你的代码中有一个错误,但它会导致大量的内存泄漏,而不是我认为的分段错误:ii上的for循环被重复嵌套,将重新分配ii遍历第二级所有数组的数组,但只保留对最后一个数组的引用。