指向指针的指针(**)做为参数时,内存分配问题探索

主      题: 一个函数要求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(); 
}

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值