VC中调试出现这样的错误,请帮忙解决下,令我费解

jimadams 2006-05-21 09:19:19
strcore.cpp(118) : {1260426} normal block at 0x0167AE60, 58 bytes long.
Data: < - - F:\1> 01 00 00 00 2D 00 00 00 2D 00 00 00 46 3A 5C 31
如此之类的错误,有好多,不知是什么原因?各位高手帮我解决下,如分不够可以再加
...全文
146 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
jimadams 2006-05-28
  • 打赏
  • 举报
回复
问题解决了,是没有释放内存,释放方法不正确
我原来用的是下面的方法:
char *pszNew2=new char[100];
delete pszNew2;
现在改为
char *pszNew2=new char[100];
delete []pszNew2;

另补充一点:关于
strcore.cpp(118) : {37} normal block at 0x007702E0, 17 bytes long.
Data: < test> 01 00 00 00 04 00 00 00 04 00 00 00 74 65 73 74
这个错误是如何产生的,xsr152639兄弟说的对,是因为没有释放CString对象,这个问题一般出在线程没有正常退出时,如果你程序中有多个线程的话。
renjwjx 2006-05-24
  • 打赏
  • 举报
回复
把release 文件夹删了,再重新生成一下,应该会很好的.

xsr152639 2006-05-22
  • 打赏
  • 举报
回复
以下是我在其他地方找到的情况,你看对你是否有帮助。


程序运行时出现类似如下错误提示窗口(VC的Debug版本):

Debug Error!
Program: program.exe
DAMAGE: after normal block (#41) at 0x00300160

这是内存泄漏的问题。用VC来进入调试,出现下面的有关内存的泄漏信息:
Detected memory leaks!
Dumping objects ->
strcore.cpp(118) : {37} normal block at 0x007702E0, 17 bytes long.
Data: < test> 01 00 00 00 04 00 00 00 04 00 00 00 74 65 73 74

但是没有提示出现内存泄漏的文件的信息,郁闷了。网上搜索一下,发现一般出现这种错误提示是CString对象没有被释放。于是我到工程文件里搜索所以CString对象,发现他们都是local object,那只有一个可能,包含这些CString的对象未被正确释放。搜索这些对象,并正确释放他们,问题解决。:)

xsr152639 2006-05-22
  • 打赏
  • 举报
回复
内存泄露检查
在VC中提供内存检查的机制是跟踪new操作,也就是说所有的new操作都会被记录,如果通过new操作所分配的内存未被正常delete将会在程序退出时在调试窗口中显示出具体的内存泄露信息。

  同样通过malloc分配的内存也会被跟踪,但是在显示时就不会知道实在程序中何处进行了malloc操作。先看一下下面的例子:

void _tmain()
{ ...
char *pszNew=(char*)malloc(200);
char *pszNew2=new char[100];
CString *pszNew3=new CString("test");
...
}

//通过调试方式运行后并退出,可以看到调试信息中关于内存泄露的信息如下:

Detected memory leaks!
Dumping objects ->
strcore.cpp(118) : {37} normal block at 0x007702E0, 17 bytes long.
Data: < test> 01 00 00 00 04 00 00 00 04 00 00 00 74 65 73 74
G:\temp2\sam_sp_33\sam_sp_33.cpp(42) : {36} normal block at 0x00770520, 4 bytes long.
Data: < w > EC 02 77 00
//对于CString *pszNew3=new CString("test");产生的信息
G:\temp2\sam_sp_33\sam_sp_33.cpp(41) : {35} normal block at 0x00770320, 100 bytes long.
Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
//对于char *pszNew2=new char[100];产生的信息
{34} normal block at 0x007703B0, 200 bytes long.
Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
//对于char *pszNew=(char*)malloc(200);产生的信息
Object dump complete.

可以看到通过new分配的内存在显示信息时会报告出在那一个文件的那一行进行的new操作,而通过malloc分配的内存则仅仅是显示出内存泄露的信息而无法定位分配内存的程序位置。

此外如果需要在文件头部定义DEBUG_NEW宏才可以正确的跟踪new操作。具体代码如下:

#ifdef _DEBUG #define new DEBUG_NEW #endif   由于对new操作的跟踪只需要在调试版本中出现所以使用了条件编译。

  我们可以看到VC所提供的检查内存泄露的方式是非常易于使用的,我们在开发程序时一定要注意内存的分配问题,特别是对于一些长时间运行的程序

masterz 2006-05-21
  • 打赏
  • 举报
回复
建议看看调试方面的书
Debugging Applications For Microsoft .NET And Microsoft Windows.chm
Debugging Applications.chm
DentistryDoctor 2006-05-21
  • 打赏
  • 举报
回复
哈哈,明显的内存泄漏!
jimadams 2006-05-21
  • 打赏
  • 举报
回复
自己顶一下,沉的太快了

7,540

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 VC.NET
社区管理员
  • VC.NET社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧