主 题: 一个函数要求OPCSERVERSTATUS **类型的参数,我定义了一
个View类的 急呀!!!内存泄漏!!
作 者: GOTOVC (书生)
所属论坛: Visual C++论坛
本帖分数: 0
回复次数: 18
发表时间: 2008-12-24 9:37:04
正文内容:
OPCSERVERSTATUS * OPCServerStatus; 使用时,我直接
bOPCStatus = KOC_GetServerStatus(pGlobalConn->m_hServer,
&OPCServerStatus);
为何执行这步骤,内存泄漏的特别严重!!!!!谢谢.如何改一下.
回复人: carr123 (举人) 2008-12-24 9:37:42
大哥你的OPC服务器是自己做的还是二次开发的?
回复人: GOTOVC (书生) 2008-12-24 9:38:07 [修改]
二次开发
回复人: wetwoo (进士) 2008-12-24 9:38:31
这什么东西,分配资源了嘛,调用后是不是需要你来释放资源啊
回复人: GOTOVC (书生) 2008-12-24 9:39:02 [修改]
我没new, 如何释放?
回复人: GOTOVC (书生) 2008-12-24 9:39:18 [修改]
难道需要一个new变量进去.?
回复人: m_tornado (书生) 2008-12-24 9:40:23
是不是调用的函数里有new呢,原来做图像有个Copy也是搞的内存泄漏,
建议跟进调看
回复人: wetwoo (进士) 2008-12-24 9:40:45
一般传入**的函数都会要求调用者使用完后,释放**的
回复人: GOTOVC (书生) 2008-12-24 9:41:22 [修改]
每次都需要吗? 这个函数可是秒级调用的??????
回复人: wetwoo (进士) 2008-12-24 9:42:15
应该需要,秒级没关系
回复人: GOTOVC (书生) 2008-12-24 9:43:54 [修改]
没new 我直接 delete 还是memset一样合适些?
回复人: wetwoo (进士) 2008-12-24 9:45:42
你看看那个函数的说明,里面应该有关于资源释放的说明
回复人: GOTOVC (书生) 2008-12-24 9:46:40 [修改]
没有,它什么也没写?
//
// GetSvrStatus (...)
//
// Allows the controlling application to get the running
// status of an attached server.
//
KOCRDK_API BOOL WINAPI KOC_GetServerStatus(HANDLE hConnect,
OPCSERVERSTATUS
**pSvrStatus);
回复人: wetwoo (进士) 2008-12-24 9:48:02
那你传入个OPCSERVERSTATUS p = NULL;看看它分配内存了没?
回复人: wetwoo (进士) 2008-12-24 9:48:20 (得分:28)
分了你就free一下,定文档的人真省事
回复人: GOTOVC (书生) 2008-12-24 9:50:44 [修改]
分内存了, delete OPCServerStatus; 也不管用呀?
回复人: wetwoo (进士) 2008-12-24 9:59:09
你怎么知道内存泄漏的?
回复人: GOTOVC (书生) 2008-12-24 10:00:50 [修改]
把它一去年就不泄漏了,太严重了.4K/秒上升!???? 用不用我先申请一个,
现在是我delete系统不让???总出错????
回复人: wetwoo (进士) 2008-12-24 10:14:07
那你跟进去看看啊
主 题:
如何删除一个由动态库申请的内存????HEAP[DCMS_SG.exe]: Invalid
Address specified to Rtl
作 者: GOTOVC (书生)
所属论坛: Visual C++论坛
本帖分数: 0
回复次数: 25
发表时间: 2008-12-24 10:51:26
正文内容:
HEAP[DCMS_SG.exe]: Invalid Address specified to
RtlValidateHeap( 900000, 16b3c0 )
回复人: YangTze (大学士) 2008-12-24 10:52:08
动态库用什么 函数申请的?
回复人: GOTOVC (书生) 2008-12-24 10:52:39 [修改]
关键是不知道呀,free/delete都不行?
回复人: folklore (举人) 2008-12-24 10:53:17
不是你申请的内存请不要Free,只能说你使用时出错了,没用对,而不是
从内存找原因,完毕
回复人: GOTOVC (书生) 2008-12-24 10:56:08 [修改]
有可能,下面的一个函数这样用可以吗????????????????
KOCRDK_API BOOL WINAPI KOC_GetServerStatus(HANDLE hConnect,
OPCSERVERSTATUS
**pSvrStatus);
使用如下:
定义全局结构变量
OPCSERVERSTATUS * OPCServerStatus;
函数中使用
bOPCStatus =
KOC_GetServerStatus(pGlobalConn->m_hServer,
&OPCServerStatus);
if(bOPCStatus)
{
}
发现一执行这段代码就内存泄漏?????谢谢.
回复人: shmsfi (举人) 2008-12-24 10:58:21
这个要看内存使用的约定,如果不是应该由你释放的内存,而你却释放了
,程序一定会出错
回复人: shmsfi (举人) 2008-12-24 10:59:11
多调用几次看看,泄漏有没有增长
回复人: GOTOVC (书生) 2008-12-24 10:59:37 [修改]
增长非常严重,,我看了.
回复人: GOTOVC (书生) 2008-12-24 11:00:25 [修改]
关键是写动态库的这个人早就没了.
回复人: YangTze (大学士) 2008-12-24 11:00:39
动态库 谁写的,问谁啊!
回复人: folklore (举人) 2008-12-24 11:00:50
????没见过这个函数,不过,MS这种情况都要先New一份内存
如果你确定库分配的,请找它的“反函数”,由它的“反函数”相Free,
而不是你自已Delete或Free
回复人: YangTze (大学士) 2008-12-24 11:01:02
没源代码?
回复人: GOTOVC (书生) 2008-12-24 11:01:12 [修改]
那个公司早没有了.
回复人: GOTOVC (书生) 2008-12-24 11:01:31 [修改]
买别人的,人早没了??
回复人: YangTze (大学士) 2008-12-24 11:04:22
可怜的娃儿
回复人: folklore (举人) 2008-12-24 11:05:03
如果你确定它有Alloc,请尝试在Release下Delete/Free
回复人: YangTze (大学士) 2008-12-24 11:06:13
所以,为了保险起见,我们一般是
一咬牙
一跺脚
自己做(除了自己实在做不了的)
回复人: GOTOVC (书生) 2008-12-24 11:06:42 [修改]
唉...
回复人: YangTze (大学士) 2008-12-24 11:07:27
祭出 OllyDebug,看看 DLL 内部
回复人: hpho (举人) 2008-12-24 11:08:43
OPCSERVERSTATUS 这个结构体来吗?里面有没有指针?
回复人: GOTOVC (书生) 2008-12-24 11:10:12 [修改]
我看了,没有!
typedef struct tagOPCSERVERSTATUS
{
FILETIME ftStartTime;
FILETIME ftCurrentTime;
FILETIME ftLastUpdateTime;
OPCSERVERSTATE dwServerState;
DWORD dwGroupCount;
DWORD dwBandWidth;
WORD wMajorVersion;
WORD wMinorVersion;
WORD wBuildNumber;
WORD wReserved;
/* [string] */ LPWSTR szVendorInfo;
} OPCSERVERSTATUS;
回复人: hpho (举人) 2008-12-24 11:19:30 (得分:18)
Re:
1,每一次KOC_GetServerStatus后OPCServerStatus都指向不同地址?
2,若OPCServerStatus不delete下一次把这个OPCServerStatus传进KOC_
GetServerStatus是否它又会分配新的空间给OPCServerStatus呢?
3,既然它提供这种alloc的方式那应该会有对应的释放方法呀.
如果1,2是肯定,3也是没提供,那应该没什么好的方法了.另一个可能是你
的用法有问题
回复人: GOTOVC (书生) 2008-12-24 11:29:49 [修改]
它没次都重新分配一个!
回复人: hpho (举人) 2008-12-24 11:32:33
Re:
帮你找了点相关的资料
http://read.pudn.com/downloads52/sourcecode/windows/network/1
82026/OpcServerCode/I_SERVER.CPP__.htm
STDMETHODIMP IXXXServer::GetStatus( OPCSERVERSTATUS**
ppServerStatus)
{
OPCSERVERSTATUS* pServerStatus;
if ( ppServerStatus == NULL)
return E_INVALIDARG;
// allocate some memory for the struct
pServerStatus = (OPCSERVERSTATUS*) pIMalloc->Alloc(
sizeof(OPCSERVERSTATUS) );
if(pServerStatus)
...
它可能是IMalloc分配的若样的话就要用对应的COM方法去释放
http://www.vckbase.com/document/viewdoc/?id=1493
回复人: GOTOVC (书生) 2008-12-24 11:35:20 [修改]
前辈:你就直接给我说一下对应的COM释放吧,我试试看.另外再给30分.
回复人: hpho (举人) 2008-12-24 11:35:33
试试CoTaskMemFree()
主 题: CoTaskMemFree()还是不行,通道需要找 IMalloc 接口 接
口不成????前辈!
作 者: GOTOVC (书生)
所属论坛: Visual C++论坛
本帖分数: 0
回复次数: 12
发表时间: 2008-12-24 11:53:21
正文内容:
<本贴无正文>
[修改本贴] [本帖已解决]
回复人: hpho (举人) 2008-12-24 12:13:51
那你试一下IMalloc的Free吧.
而且也有可能不是用IMalloc分配的.只能把所有有可能的方法都试一遍了
.
不熟COM.可以试试
bOPCStatus = KOC_GetServerStatus(pGlobalConn->m_hServer,
&OPCServerStatus);
if(bOPCStatus)
{
}
....
//::CoInitialize( NULL );
IMalloc * pMalloc = NULL;
hr = ::CoGetMalloc( 1, &pMalloc );
if ( SUCCEEDED(hr) )
{
pMalloc->Free( OPCServerStatus);
pMalloc->Release();
}
//::CoUninitialize();
回复人: hpho (举人) 2008-12-24 12:19:02
不过IMalloc是封装CoTaskMem**的
既然CoTaskMemFree不是那IMalloc的Free也可能不行. 所以可能它是用
其它分配内存函数.
pls,不要给分偶!
回复人: GOTOVC (书生) 2008-12-24 12:21:33 [修改]
如何用这个接口的Free??谢谢.
回复人: hpho (举人) 2008-12-24 12:23:47
Re:
bOPCStatus = KOC_GetServerStatus(pGlobalConn->m_hServer,
&OPCServerStatus);
if(bOPCStatus)
{
}
....
//::CoInitialize( NULL );
IMalloc * pMalloc = NULL;
hr = ::CoGetMalloc( 1, &pMalloc );
if ( SUCCEEDED(hr) )
{
pMalloc->Free( OPCServerStatus);
pMalloc->Release();
}
//::CoUninitialize()
回复人: GOTOVC (书生) 2008-12-24 12:28:02 [修改]
还是涨,
回复人: hpho (举人) 2008-12-24 12:30:38
那还会出异常吗?
回复人: GOTOVC (书生) 2008-12-24 12:32:23 [修改]
不会, 用CoTaskMemFree()/GlobalFree()时已经不会出异常了,好像现在
是内存没有真正释放???
回复人: GOTOVC (书生) 2008-12-24 12:34:35 [修改]
非常有规则,每次涨4K
回复人: hpho (举人) 2008-12-24 12:40:49 (得分:30)
Re:
用CoTaskMemFree()释放完后你试试
OPCServerStatus->wReserved = 0; // 若异常证明OPCServerStatus被
释放了.
然后OPCSERVERSTATUS下有一个szVendorInfo 字段它是指针.
而我之前帖那段OPC的代码中它是
pServerStatus = (OPCSERVERSTATUS*) pIMalloc->Alloc(
sizeof(OPCSERVERSTATUS) );
if(pServerStatus)
{
// and for the serverinfo string
pServerStatus->szVendorInfo = WSTRClone( VendorInfo,
pIMalloc);
所以若OPCServerStatus释放了但szVendorInfo 可能没释放.
回复人: GOTOVC (书生) 2008-12-24 12:47:39 [修改]
现在可以肯定,OPCServerStatus已经被释放掉,
那么如何释放一下szVendorInfo呢?谢谢.
回复人: hpho (举人) 2008-12-24 12:52:34
Re:
//不知你用IMalloc::Free还是CoTaskMemFree,GlobalFree
//反正用你可以释放OPCserverStatus的方法去释放szVendorInfo应该就
可以了.
void my_free(void* pv)
{
//::CoInitialize( NULL );
IMalloc * pMalloc = NULL;
hr = ::CoGetMalloc( 1, &pMalloc );
if ( SUCCEEDED(hr) )
{
pMalloc->Free( pv );
pMalloc->Release();
}
//::CoUninitialize()
}
bOPCStatus = KOC_GetServerStatus(pGlobalConn->m_hServer,
&OPCServerStatus);
if(bOPCStatus)
{
}
....
my_free(OPCServerStatus->szVendorInfo);
my_free(OPCServerStatus);
....
回复人: GOTOVC (书生) 2008-12-24 12:58:20 [修改]
谢谢你,真的非常谢谢.你的思路清晰/分析问题解决问题的能力很强. 很
值得我这个晚辈的学习.下午我将做个总结,到时再补分!
IMalloc * pMalloc = NULL;
HRESULT hr = ::CoGetMalloc( 1, &pMalloc );
if ( SUCCEEDED(hr) )
{
pMalloc->Free( OPCServerStatus->szVendorInfo);
pMalloc->Free( OPCServerStatus);
pMalloc->Release();
}