本帖最后由 askgun4 于 2011-05-03 17:51:33 编辑

解决方案 »

  1.   

    template <typename T>
    void LinearStrenchImageData(double maxValue,double minValue,T * imageData,BYTE *resultImageData,int imageDataSize,float lowRate,float highRate)
    { CRasterInfo rasterInfo ;
    int * gradsNo = NULL ;
    gradsNo = new int[((int)maxValue-(int)minValue+1)]; 
    //灰阶差值(最大灰度和最小灰度的差值)
    int outsize =(int)maxValue-(int)minValue+1 ;
    //获取图像范围内从最小到最大灰度的所有该灰度值的个数,outsize为返回的数组的大小
    gradsNo = rasterInfo.histGetGrads(imageData,imageDataSize,outsize,(int)maxValue,(int)minValue) ;
    //需要拉伸的低位值和高位值
    int lowOmittedBound,highOmittedBound ;
    int gradsNoSize = (int)((int)maxValue-(int)minValue+1);
    rasterInfo.histGetBounds(imageDataSize,gradsNo,gradsNoSize,lowRate,highRate,lowOmittedBound,highOmittedBound,(int)maxValue,(int)minValue) ; rasterInfo.LinearEnhanceImage(imageData,imageDataSize,lowOmittedBound,highOmittedBound) ;
    for (int i=0;i<m_XSize*m_YSize;i++)
    {
    resultImageData[i] = (BYTE)imageData[i];
    } if (gradsNo!=NULL)
    {
    delete []gradsNo ;//问题,内存没有删除,找办法
    gradsNo = NULL ;
    }

    }
      

  2.   

    gradsNo = new int[((int)maxValue-(int)minValue+1)];  
    gradsNo = rasterInfo.histGetGrads(imageData,imageDataSize,outsize,(int)maxValue,(int)minValue) ;
    指针重指向了
      

  3.   

    如果需要拷贝,用memcpy或遍历数组
      

  4.   

    rasterInfo.histGetGrads(imageData,imageDataSize,outsize,(int)maxValue,(int)minValue) ;
    返回的指针啊 
      

  5.   

    关键是有没有修改gradsNo的指向。如果修改了,肯定delete的时候就会出错。
      

  6.   


    int * gradsNo = NULL ;
    gradsNo = new int[((int)maxValue-(int)minValue+1)];/*@@@*///灰阶差值(最大灰度和最小灰度的差值)
    int outsize =(int)maxValue-(int)minValue+1 ;
    //获取图像范围内从最小到最大灰度的所有该灰度值的个数,outsize为返回的数组的大小
    gradsNo = rasterInfo.histGetGrads(imageData,imageDataSize,outsize,(int)maxValue,(int)minValue) ;/*这里,你的指针 gradsNo 已经不再指向  @@@  所标记的行申请的那段内存空间了。*/
     
    gradsNo  指针经过第二次赋值后,已经不再指向  @@@  所标记的行申请的那段内存空间了。这时你在后面delete []gradsNo;
    当然不能释放第一次new申请的内存啊