导航
  • 主页
  • VC综合技术
  • 互联网技术
  • MFC AppLauncher
  • .NET 技术
  • 界面
  • 进程
  • 算法
  • 硬件/系统
  • 数据库
  • VC++技术资源

关于内存泄露问题请教

murouwolf 2004-04-06 12:23:41
我写的一个服务器程序中,客户机采用无限制开启线程的方法模拟多 客户连接。服务器没有调用任何new的地方(初始化服务器时候分配的内存不在此列),而且也没有创建过任何自定义对象,对于所有的socket对象,最终也都正常closesocket了,但是,程序运行时候消耗内存总会不断增加,百思不得其解,请求高人指点。另外我所有的内存分配都使用以下两个函数,昨天我曾经用另外一种限制客户连接频率和线程个数的方法限制了内存的无限制增长,但结果造成了虚拟内存过在一段时间后会发生不足。

namespace __farfhy
{
namespace memory
{

__inline PBYTE cfmalloc(UINT s)
{
UINT nNewSize = (UINT) ceil(s / 1024.0) * 1024;

PBYTE pNewBuffer = (PBYTE) VirtualAlloc(NULL,nNewSize,MEM_COMMIT,PAGE_READWRITE);

return pNewBuffer;

}

__inline VOID cffree(PVOID p)
{

if (p)
{
VirtualFree(p,0,MEM_RELEASE);
}
}
}
}
我对内存分配不是很了解,想请教高人,到底有何种方法可以非常准确的找出内存泄露??boundschecker根本不能跑我的程序,郁闷死,另外我的程序是delphi的dll调用vc的dll,结果delphi程序可以调试,vc的程序一调试就当掉,有高人可以指点原因的话感激不尽
...全文
25 点赞 收藏 5
写回复
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
murouwolf 2004-04-08
自己再顶一下
回复
murouwolf 2004-04-07
还有哥哥有更好的建议吗?比如什么工具???或者有什么不需要在debug环境下使用的函数等等???(我VC程序不能调试,因为delphi一调用就会当掉)
回复
fzd999 2004-04-06
VirtualAlloc,使用的是页面文件空间,第一个参数代表的是进程句柄。
建议楼主使用malloc,然后检查返回值
回复
曾经的猎狐 2004-04-06
内存泄露检查

在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所提供的检查内存泄露的方式是非常易于使用的,我们在开发程序时一定要注意内存的分配问题,特别是对于一些长时间运行的程序
回复
sxxny 2004-04-06
你用VirtualAlloc和用new不是一样的吗.
可能也是因为你申请了内存没有释放了
回复
发动态
发帖子
VC/MFC
创建于2007-09-28

1.5w+

社区成员

VC/MFC相关问题讨论
申请成为版主
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……