该段代码是否会内存泄露?

hero743 2006-04-04 08:35:56
COM返回数组数据到vb,数组在com中创建,内存会泄漏吗,内存有在哪里被释放呢?

STDMETHODIMP CTestCom1::retarray(VARIANT *buffer)
{
//返回数组
SAFEARRAY FAR* psa;
SAFEARRAYBOUND rgsabound[1];
rgsabound[0].lLbound=0;
rgsabound[0].cElements=2;
psa=SafeArrayCreate(VT_I4,1,rgsabound);

long idx;
long setdt;

idx=0;
setdt=12;

SafeArrayPutElement(psa,&idx,&setdt);
idx=1;
setdt=342;
SafeArrayPutElement(psa,&idx,&setdt);

V_VT(buffer) = VT_ARRAY | VT_I4;
V_ARRAY(buffer)=psa;


return S_OK;
}


vb中的代码为:
Dim oo As ARRAYTESTLib.TestCom1
Set oo = New ARRAYTESTLib.TestCom1
Dim rarr As Variant
oo.retarray rarr
MsgBox rarr(0) & rarr(1)
...全文
323 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
我知道BSTR类型是外部释放的
但数组就不知道了
MLiang 2006-04-06
  • 打赏
  • 举报
回复
方向 申请人 释放人 提示
[in] 调用者 调用者 组件接收指针后,不能重新分配内存
[out] 组件 调用者 组件返回指针后,调用者“爱咋咋地”(注3)
[in,out] 调用者 调用者 组件可以重新分配内存
snowflyman 2006-04-05
  • 打赏
  • 举报
回复
当然会泄露,你在组件中声明的 SAFEARRAY ,那么这个内存空间应由组件来控制,可是在最后,你是直接把这个地址返回了,那么当客户端所声明的传递变量生命周期结束时,你的这块内存也将跟着被释放,所以你的组件就发生内存泄露了
yongdu 2006-04-05
  • 打赏
  • 举报
回复
那就说明没有释放内存。
以前好像遇到过此类似问题,我当时是在com中增加一个方法,专门来释放用完后没其它好办法释放的内存。你可以在com中增加一个方法,外面retarray方法调用后,再调用此方法由vc这边自已释放内存。
wlwlxj 2006-04-05
  • 打赏
  • 举报
回复
用别的方法把,没有用国VB
hero743 2006-04-04
  • 打赏
  • 举报
回复
用COleVaraint类来操作是不是能解决这个问题?代码应该怎么写呢?高手请指教!
yongdu 2006-04-04
  • 打赏
  • 举报
回复
vb不会,听说是不用管理内存的。
你的代码com内是分配了内存的,由外面vb释放?
hero743 2006-04-04
  • 打赏
  • 举报
回复
请问调用者没有释放吗?该如何做?
teli_eurydice 2006-04-04
  • 打赏
  • 举报
回复
会,分配内存没有回收
hero743 2006-04-04
  • 打赏
  • 举报
回复
自己顶一下
hero743 2006-04-04
  • 打赏
  • 举报
回复
数组是在com里创建的,没调用一次内存就不断增加
gufengduyu 2006-04-04
  • 打赏
  • 举报
回复
vb自动管理内存,应该不会有问题。
hero743 2006-04-04
  • 打赏
  • 举报
回复
用COleVaraint类来操作是不是能解决这个问题?代码应该怎么写呢?高手请指教!

3,245

社区成员

发帖
与我相关
我的任务
社区描述
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
  • ATL/ActiveX/COM社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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