您的位置:首页 > 移动开发

有关“CRT detect that the application wrote to memory after end of heap buffer”问题的解决

2014-03-05 15:59 411 查看
       今天在编写函数求解矩阵的逆时出现“CRT detect that the application wrote to memory after end of heap buffer”的问题,主要代码如下:

   a = (double**)malloc(N*sizeof(int*));
   L = (double**)malloc(N*sizeof(int*));
   U = (double**)malloc(N*sizeof(int*));
   out = (double**)malloc(N*sizeof(int*));
   out1 = (double**)malloc(N*sizeof(int*));
   r = (double**)malloc(N*sizeof(int*));
   u = (double**)malloc(N*sizeof(int*));

   for(count=0;count<N;count++)
   {    a[count]=(double*)malloc(N*sizeof(double)); 
        L[count]=(double*)malloc(N*sizeof(double));
        U[count]=(double*)malloc(N*sizeof(double)));
        out[count]=(double*)malloc(N*sizeof(double));
        out1[count]=(double*)malloc(N*sizeof(double));
        r[count]=(double*)malloc(N*sizeof(double));
        u[count]=(double*)malloc(N*sizeof(double));

   }

   memset( &a[0][0] , 1, N*N);
   memset( &L[0][0] , 1 , N*N);
   memset( &U[0][0] , 1 , N*N);
   memset( &out[0][0] , 1 , N*N);
   memset( &out1[0][0] , 1 , N*N);
   memset( &r[0][0] , 1 , N*N);
   memset( &u[0][0] , 1 , N*N);

     ... ...

   for (count=0;count<N;count++)
       {
         free(a[count]);
         free(L[count]);
         free(U[count]);
         free(out[count]);
         free(out1[count]);
         free(r[count]);
         free(u[count]);
       }
   
       free(a);
       free(L);
       free(U);
       free(out);
       free(out1);
       free(r);
       free(u);
       return 1;       
    }

    调试时是在free处出现错误,经过分析查资料知道是memset函数处出现了问题,应该改为

    memset( &a[0][0] , 1, sizeof(a));

    memset( &L[0][0] , 1 , sizeof(L));

    memset( &U[0][0] , 1 , sizeof(U));

    memset( &out[0][0] , 1 , sizeof(out));

    memset( &out1[0][0] , 1 , sizeof(out1));

    memset( &r[0][0] , 1 , sizeof(r));

    memse
4000
t( &u[0][0] , 1 , sizeof(u)); 

    或

   for (count=0;count<N;count++)

      {

       memset(a[count], 1, N*sizeof(double));

       memset(L[count], 1, N*sizeof(double));

       memset(U[count], 1, N*sizeof(double));

       memset(out[count], 1, N*sizeof(double));

       memset(out1[count], 1, N*sizeof(double));

       memset(r[count], 1, N*sizeof(double));

       memset(u[count], 1, N*sizeof(double));

      }

       原因:出现越界,初始化数组时写入了未分配的内存,并且在sizeof(int *) <= sizeof(double)的时候是成立的,所以在写入长度小于分配长度时不报错,但这样不合理,应该初始化数组的所有元素,以防不可预知的错误。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  C++ heap malloc