_CrtIsValidHeapPointer(pUserData)

程序遇到如题的运行时报错,参考下面这段文字,采取将自定义类的对象定义改为new方式生成后问题解决。

!!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将被预处理器移除。大概就是这个样子,上面所说的很多东西我都不确定,只是现在的一种解释。

可能原因:DLL和EXE主程序使用的不是同一个堆造成。

解决办法:

1. 采用谁分配谁释放的原则;

2. 绕过 new 和 delete,使用 GlovalAlloc 和 GlobalFree;

3. 更改工程选项, release 版本肯定不会出现这个失败,这个只会存在 debug 状态下,但是 release 会出现内存泄漏. 更改 debug 下 dll 和 exe 运行库为动态编译即: multi-threaded debug dll. 因为 multi-thread debug dll 运行库编译使编译器为所有dll共享分配的堆。这样就不会存在多个释放过程,也就不会出现问题了.

时间: 2024-11-16 10:23:25

_CrtIsValidHeapPointer(pUserData)的相关文章

VS调试程序_ASSERTE(_CrtIsValidHeapPointer(pUserData))崩溃的原因以及解决方法

调试程序,对动态申请的内存用free或者delete释放时程序崩溃,跳出如下对话框: 点击重试,定位到具体的CRT源码部分:_ASSERTE(_CrtIsValidHeapPointer(pUserData)): 1.原因分析: 查看CRT源码,一步一步看看里面都干了什么吧: _CrtIsValidHeapPointer----->_CrtIsValidPointer---->HeapValidate 首先在_CrtIsValidPointer中检测这个指针是否有效,即不为空:然后调用WInd

vector 析构异常 opencv Assert _CrtIsValidHeapPointer

代码一气呵成,但运行的时候会出现_CrtIsValidHeapPointer的异常,跟进去调了一上午的Bug,终于搞定 跟踪定位到 _CrtIsValidHeapPointer ,注意到 g 8h"@dbgheap.c 文件中 _CrtIsValidHeapPointer 处注释: /* * If this ASSERT fails, a bad pointer has been passed in. It may be * totally bogus, or it may have bee

_CrtIsValidPointer 问题

从微软站点: 检查指针有效性下面的示例使用 _CrtIsValidPointer 验证给定的内存范围对于读或写是否有效. _ASSERTE(_CrtIsValidPointer( address, size, TRUE ); 下面的示例使用 _CrtIsValidHeapPointer 验证指针指向本地堆(由 C 运行时库的这个实例创建和管理的堆: DLL 可以有它自己的库实例,因而也可以有它自己的.位于应用程序堆之外的堆)中的内存. 该断言不仅捕捉空地址或超出边界的地址,还捕捉指向静态变量.堆

关于Debug Assertion Failed问题

Debug Assertion Failed program:D\... LINE:1044 Expression:_CrtIsValidHeapPointer(pUserData) for information on how your program can cause an assertion failure,see the Visual C++ documentation on asserts. (Press Retry to debug the application) 学习链表时遇到

看数据结构写代码(21) 稀疏矩阵(十字链表方式)

写完 这个样例,花费了 我不少时间.大部分时间 花费在 调试 内存问题上. 比如在销毁十字链表时.多次释放节点空间,造成 _CrtIsValidHeapPointer(pUserData) 异常. 当使用malloc 分配 一个 空间时,会将这个空间的起始地址和长度 加到一个链表中去.free(p)的时候 ,会从 链表里 查找 是否 有 这个地址空间,找到了就将这个节点从链表中删除._CrtIsValidHeapPointer(pUserData)  这个函数 正是 检查 这个空间是否 在链表里

_BLOCK_TYPE_IS_VALID _CrtIsValidHeapPointer

[现象]: 在lib中,有如下代码 int* pn = new int[3]; delete []pn; 在运行时出错, _BLOCK_TYPE_IS_VALID 或者 _CrtIsValidHeapPointer [原因]: 在debug版本中 lib中用的md连接,exe用的也是md连接 [解决]: 都改成mdd,或者至少把exe改成mdd

(一)C++入门——指针与数组——Expression: _CrtIsValidHeapPointer(Block)

最近在入门c++,在看<c++ Primer Plus>一书.书中P106提到,删除使用New创建的数组时,是将指针重新指到第一个元素后,再进行的删除操作.代码如下: int *ptest = new int[3]; ptest[0]=1; ptest[1]=2; ptest[2]=3; cout<<"*ptest "<<*ptest<<endl; ptest = ptest+1;//此时指针指向第二个元素,也即:ptest[1] cou

c++内存管理错误记录

extern "C" _CRTIMP int __cdecl _CrtIsValidHeapPointer( const void * pUserData ){ if (!pUserData) return FALSE; if (!_CrtIsValidPointer(pHdr(pUserData), sizeof(_CrtMemBlockHeader), FALSE)) return FALSE; return HeapValidate( _crtheap, 0, pHdr(pUse

海康门禁-开,关,常开,常关,授权,清权

using System; using System.Collections.Generic; using System.Linq; using System.Text; using AccessBusiness.Common; using System.Runtime.InteropServices; namespace AccessBusiness { public class HIV { /// <summary> /// 初始化门禁SDK /// </summary> //