我今天在调试0507程序时,遇到了错误,报错是:Microsoft Visual Studio C 运行时库在 0507.exe 中检测到一个错误
通过F9和F5的断点调试,发现出错代码在sprintf处,代码如下:
向上翻看sprintf中temp变量的定义如下:
既然sprintf发生异常,那么说明定义temp变量时出错了,导致在使用时发生内存错误,参考文章http://blog.csdn.net/yuzhiyi926/article/details/7239675后,将temp变量定义换做char temp[200]就好了。
——————————————————————————————————————————————-
参考文章如下:
http://blog.csdn.net/yuzhiyi926/article/details/7239675
以下内容转载http://blog.csdn.net/yuzhiyi926/article/details/7239675
现象:
Microsoft Visual Studio C 运行时库在 arctic.exe 中检测到一个错误。
按“中断”以调试程序,或按“继续”以终止程序。
当点击中断调试的时候,程序会执行到绿色这一行:
void __cdecl _CRT_DEBUGGER_HOOK(int _Reserved)
{
/* assign 0 to _debugger_hook_dummy so that the function is not folded in retail */
(_Reserved);
_debugger_hook_dummy = 0;
}
原因:
其实这个错误的原因主要是因为内存空间的重复分配时发生错误(或内存访问异常)。
如下面:
CString str = L”aaaaaaaaa”; 或者 str.Format(L”%s”,L”aaaaaaaaaa”);
str.Format(L”%s%s”,str,L”bbbbbbb”);
这样子就会导致上面的错误信息。这是因为用FORMAT会在内部根据格式化参数列表对字符串本身的内在空间进行重新分配
而如果直接采用字符串本身作为参数传入的话,会造成内在的冲突,而这个冲突是无法遇见的,即不会经常出现。所以,为了避免上面的问题,应避免使用上述的方法。
CString temp= L”aaaaaaaaa”; 或者 temp.Format(L”%s”,L”aaaaaaaaaa”);
str.Format(L”%s%s”,temp,L”bbbbbbb”);
只需多采用一个变量即可。
* 注意:避免将字符串本身作为参数传入到使用FORMAT格式化列表的原来字符串中。
另外,还有一些情况是从网上找的,不知道是否真的是这样,没有进行验证,仅供参考。
1.在很短的时间内创建多线程…
for (int i =0; i < 100; i++)
HANDLE handle = CreateThread(…..);
在1秒内一下子创建几十个线程有可能出现这种状况。
2. 在很短时间内访问同一个文件的操作,同时没有加锁
和1差不多吧,
3.多线程在很短的时间间隔内共同操作用户界面
转载请注明:jinglingshu的博客 » Microsoft Visual Studio C 运行时库在 XXX.exe 中检测到一个错误。