首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C#中的堆错误

C#中的堆错误
EN

Stack Overflow用户
提问于 2012-07-03 15:48:30
回答 2查看 789关注 0票数 1

我有一个用于测试C++/CLI程序集的C#程序(此程序集是本机C++ dll的包装器),并收到以下错误消息:

代码语言:javascript
复制
Unhandled exception at 0x50f8fd85 (msvcr90d.dll) in TestKeyManagerApp.exe: 0xC0000005:     Access violation writing location 0x00000000.

调试模式中的最后一个位置: dbgheap.c (Visual studio 2008输出)

代码语言:javascript
复制
if (pHead == NULL)
{
    *errno_tmp = ENOMEM; <----- ACCESS VIOLATION
    RTCCALLBACK(_RTC_FuncCheckSet_hook,(1));
}

我创建了一个程序集类的对象(我的C#程序的私有成员),在构造函数中我加载了本机C++动态链接库,现在如果我第二次使用程序集对象(第二次调用测试函数),我得到了这个错误消息!

调用堆栈的输出:

代码语言:javascript
复制
msvcr90d.dll!_heap_alloc_dbg_impl(unsigned int nSize=532, int nBlockUse=2, const char * szFileName=0x50ec24a8, int nLine=588, int * errno_tmp=0x00000000)  Line 431 + 0x3 bytes C++

msvcr90d.dll!_nh_malloc_dbg_impl(unsigned int nSize=532, int nhFlag=0, int nBlockUse=2, const char * szFileName=0x50ec24a8, int nLine=588, int * errno_tmp=0x00000000)  Line 239 + 0x19 bytes   C++

msvcr90d.dll!_calloc_dbg_impl(unsigned int nNum=1, unsigned int nSize=532, int nBlockUse=2, const char * szFileName=0x50ec24a8, int nLine=588, int * errno_tmp=0x00000000)  Line 593 + 0x20 bytes   C++

msvcr90d.dll!_getptd_noexit()  Line 588 + 0x1a bytes    C

msvcr90d.dll!_errno()  Line 281 + 0x5 bytes C

msvcr90d.dll!_calloc_dbg(unsigned int nNum=1, unsigned int nSize=532, int nBlockUse=2, const char * szFileName=0x50ec20a4, int nLine=373)  Line 646 + 0x11 bytes    C++

msvcr90d.dll!__CRTDLL_INIT(void * hDllHandle=0x50ec0000, unsigned long dwReason=2, void * lpreserved=0x00000000)  Line 373 + 0x18 bytes C

msvcr90d.dll!_CRTDLL_INIT(void * hDllHandle=0x50ec0000, unsigned long dwReason=2, void * lpreserved=0x00000000)  Line 214 + 0x11 bytes  C

ntdll.dll!77c68968()    
[Frames below may be incorrect and/or missing, no symbols loaded for ntdll.dll]
ntdll.dll!77c73820()    
ntdll.dll!77c735bc()    

我希望你能给我一些提示或建议?

谢谢!

EN

回答 2

Stack Overflow用户

发布于 2012-07-03 16:06:54

检查调用堆栈,特别是非托管堆栈。为此,必须启用非托管代码调试。这可能是虚假的删除或悬挂/无效指针访问。通过最小化本机DLL调用来缩小问题范围。

票数 1
EN

Stack Overflow用户

发布于 2012-07-03 15:53:49

错误的潜在原因:

  • pointer errno_tmp可能指向已删除的内存,或者指向数组边界之外(-ve索引或索引>=长度)。
  • 使用了无效的P\Invoke,或者加载的程序集已被删除
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11306602

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档