User breakpoint called from code at 0x********
今天调试程序时在Debug版跳出这个错误..我根本程序没设置断点.而其好像说是我的堆有问题,而编译了个Release版本运行正常..后来google下,查到如下解释:
说是调试状态下,操作系统用DebugWin32Heap来替代正常的heap分配内存空间。在这个堆上的任何操作debug的堆管理器会检查堆的数据完整性,如果它发现了一个错误,就会报告一个消息上来。当一个应用程序PageHeap机制被激活时,该应用程序的所有的堆分配被放到内存中,这样堆的边界就与虚拟内存的边界排在一起了。与堆相邻的虚拟内存页面被设置为NO_ACCESS。在该应用程序中对堆后面的空间的访问就会立刻引起错误,这就可以在一个调试工具中被捕获。在释放堆时,过程与之类似。PageHeap修改释放的应用程序虚拟页面为NO_ACCESS,这样,如果应用程序试图读写该内存时就会发生访问错误.
既然是Heap的问题我就查遍了所有源代码的new和delete操作的代码,看来下感觉没有任何问题..改分配的都分配了该释放的也都释放了..而且没有错误情况.后来没办法弄个极端的,我把程序的中所有delete 的语句全部注释.再运行程序.果然没问题了...- -..我又继续查了下程序.感觉还是没问题....后来定位了一个一条delete 只要有它程序就报错.没有就正常.发现这个delete位于一个移除服务的函数中.这里有必要说下我的程序结构
我将服务全部存入dll中 主要函数一个四个(其他的就不说了)
createSrv 建立服务 removeSrv 移除服务 runSrv 运行服务 stopSrv 停止服务
而这个delete正好位于removeSrv中...但是我的delete没有任何问题.后来没办法有google下.找到了一个和我遇到同样问题的人..http://hi.baidu.com/yanerxh/blog/item/88d58455ace78cc2b645ae8e.html....
"重复释放导致的问题,User breakpoint called from code at 0x77f9193c ,以上原因是由于释放了一个类的员,最后在作该类的析构时由于它的成员已经被释放导致出错(该成员被释放但是没有设 NULL)"
看完这句话后我立刻去看我的类的析构函数(由于我的dll为了通用并不是导出类而是导出函数,而我调用方编写了调用类来调用dll导出函数,达到统一管理和封装的目的),果然 - -||...我怕万一我的调用没有 " stopSrv 停止服务 "和"removeSrv 移除服务 " 我在析构函数中又调用了这个两个函数....郁闷我从9点陆陆续续调试到现在 - -.....写此文章警示后人......