Expression: _CrtIsValidHeapPointer(pUserData)

打算把编程中出现的比较麻烦的问题都记下来,一来以后出现同样的问题有证可查,二来如果有人遇到同样的问题,那么就不用那么费劲自己死磕了~

!!Expression: _CrtIsValidHeapPointer(pUserData)

void CImageRecView::OnFileColhistogram()
{
 // TODO: Add your command handler code here
 CImageRecDoc *pDoc = GetDocument();
 LPSTR lpDIB;

 ColHistogram MyColHist;

 lpDIB = (LPSTR)::GlobalLock((HGLOBAL)pDoc->GetHDIB());
 
 pMyColHist->RGBtoHSV(lpDIB);

 ::GlobalUnlock((HGLOBAL)pDoc->GetHDIB());
}

问题就出在红色的地方,自定义了一个类

将上面的语句改为

  ColHistogram * pMyColHist;
 pMyColHist = new ColHistogram;

就可以了,不过现在也不知道为什么

(MSDN)中的这段话

The   _CrtIsValidHeapPointer   function   is   used   to   ensure   that   a   specific   memory   address   is   within   the   local   heap.   The   “local”   heap   refers   to   the   heap   created   and   managed   by   a   particular   instance   of   the   C   run-time   library.   If   a   dynamically   linked   library   (DLL)   contains   a   static   link   to   the   run-time   library,   then   it   has   its   own   instance   of   the   run-time   heap,   and   therefore   its   own   heap,   independent   of   the   application’s   local   heap.   When   _DEBUG   is   not   defined,   calls   to   _CrtIsValidHeapPointer   are   removed   during   preprocessing.

看了这段话稍微觉得有点意思了,我在程序中自己申请了本地堆,也有要生成动态连接库的DIB类,要连接c运行库,那么我的ColHistogram的实例必须动态生成,因为它在c运行库中没有对应的堆。比如我添加Cstring str;程序就不会有问题,但是我只知道CString是系统定义的,和c运行库有什么关系我就不清楚了。如果静态链接C运行库,那么,dll就要拥有一个独立于应用程序(调用它的exe)的本地堆(但是我的程序没有),如果没有定义_DEBUG,那么_CrtIsValidHeapPointer将被预处理器移除。大概就是这个样子,上面所说的很多东西我都不确定,只是现在的一种解释。

还有dbgheap.c文件似乎是在dll里,还没有办法看

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值