我是 C 编程新手。我正在使用 Visual Studio 2010 在 C++ 代码中运行 CPLEX 库。执行某些操作时出现访问冲突。
违规在 CRT 文件 mlock.c 中定义的函数 void __cdecl _unlock 中报告。具体的行是 LeaveCriticalSection(_locktable[locknum].lock);。
错误消息是 0x0f63443b 处的未处理异常:0xC0000005:访问冲突写入位置 0xeb43c7c4。我的解释是这是一个与内存相关的问题,但我不确定。另外,我不知道如何在代码中跟踪内存块 0xeb43c7c4。
下面是调用栈:
cplex124.dll!0fdd443b()
[Frames below may be incorrect and/or missing, no symbols loaded for cplex124.dll]
cplex124.dll!0fdd3bbb()
cplex124.dll!0fcd0610()
cplex124.dll!0fccfbfd()
cplex124.dll!0feb70fd()
cplex124.dll!0fede883()
> name.exe!_unlock(int locknum) Line 375 C
name.exe!_unlock_file2(int i, void * s) Line 356 + 0x9 bytes C
name.exe!printf(const char * format, ...) Line 68 + 0x10 bytes C
name.exe!main(int argc, char * * argv) Line 620 + 0xe bytes C++
name.exe!__tmainCRTStartup() Line 278 + 0x12 bytes C
kernel32.dll!7693ed6c()
ntdll.dll!7701377b()
ntdll.dll!7701374e()
_unlock 的源代码位于 mlock.c 文件中:
void __cdecl _unlock (
int locknum
)
{
/*
* leave the critical section.
*/
LeaveCriticalSection( _locktable[locknum].lock );
}
#ifdef _M_IX86
#pragma optimize("y",on)
#endif /* _M_IX86 */
printf 的来源在文件 printf.c 中,如下所示:
int __cdecl printf (
const char *format,
...
)
/*
* stdout 'PRINT', 'F'ormatted
*/
{
va_list arglist;
int buffing;
int retval;
_VALIDATE_RETURN( (format != NULL), EINVAL, -1);
va_start(arglist, format);
_lock_str2(1, stdout);
__try {
buffing = _stbuf(stdout);
retval = _output_l(stdout,format,NULL,arglist);
_ftbuf(buffing, stdout);
}
__finally {
_unlock_str2(1, stdout);
}
return(retval);
}
如果我在项目属性中删除音乐会文件的链接,我会收到相同的错误消息,但在文件 tidtable.c 中的 _CRTIMP PFLS_GETVALUE_FUNCTION __cdecl __set_flsgetvalue() 行:PFLS_GETVALUE_FUNCTION flsGetValue = FLS_GETVALUE;
我会很感激任何建议。
谢谢。