!!!!!!!局部函数中 开辟的空间没有办法删除 ,其原因可能是堆被损坏,它所加载的任何DLL中有BUG 本帖最后由 askgun4 于 2011-05-03 17:51:33 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 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 ; } } gradsNo = new int[((int)maxValue-(int)minValue+1)]; gradsNo = rasterInfo.histGetGrads(imageData,imageDataSize,outsize,(int)maxValue,(int)minValue) ;指针重指向了 如果需要拷贝,用memcpy或遍历数组 rasterInfo.histGetGrads(imageData,imageDataSize,outsize,(int)maxValue,(int)minValue) ;返回的指针啊 关键是有没有修改gradsNo的指向。如果修改了,肯定delete的时候就会出错。 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申请的内存啊 VC列表插入 在非框架创建的视图中,在创建form的时候,用资源编辑器添加到form的ActiveX控件为什么不能被创建呢? 有南京的朋友吗? 关于MFC 函数AfxSocketInit是什么意思,怎么用? 高分奉送!!!!!请问如何在CListCtrl中可以实现CComboBox呢? 如何定义全局变量 怎么提高gdi函数的精确性啊 如何将三个Vc++的MFC程序合并成一个 关于gettooltip 关于skin++3.0 For vc 的一个问题! 有人玩过打印服务器这东西吗
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 ;
}
}
gradsNo = rasterInfo.histGetGrads(imageData,imageDataSize,outsize,(int)maxValue,(int)minValue) ;
指针重指向了
返回的指针啊
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申请的内存啊