Dll中SAFEARRAY内存泄漏的问题

cs_dn_net cs_dn_net 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
要写个DLL给VB调用,实现从VB中传入一个动态数组,DLL中进行处理及调整数组大小后返回。
C++中的测试代码如下:
__declspec(dllexport) long __stdcall TestArr(LPSAFEARRAY *VbArray,long nNewEle)
{
LPSAFEARRAY pSa;
SAFEARRAYBOUND iBound;
iBound.lLbound = 0; // 数组起始位
iBound.cElements = nNewEle; // 数组元素
long nPreEle(0);
if (*VbArray == NULL){
if ((pSa = SafeArrayCreate(VT_I4,1,&iBound)) == NULL) return -1;// 创建SafeArray描述符
try{
nPreEle = (*VbArray)->rgsabound->cElements;
}catch(...){
nPreEle = 0;
}
*VbArray = pSa;// 返回SafeArray描述符
}else{
if ((*VbArray)->cDims != 1) return -1;//一维数组
nPreEle = (*VbArray)->rgsabound->cElements;
}
long *pNew=(long *)malloc(nNewEle*sizeof(long));
if (pNew != NULL) {
memset(pNew,0,nNewEle*sizeof(long));
if (nPreEle>0) {//复制原数组元素
long *pData = NULL;
SafeArrayAccessData(*VbArray,(LPVOID *)&pData);
if (pData != NULL) {
if (nPreEle<=nNewEle) {
memcpy(pNew,pData,nPreEle*sizeof(long));
} else {
memcpy(pNew,pData,nNewEle*sizeof(long));
}
}
SafeArrayUnlock(*VbArray);
}
for(long i=nPreEle; i<nNewEle; i++)
pNew[i]=nNewEle-i;
SafeArrayRedim(*VbArray,&iBound);
(*VbArray)->pvData = pNew;
return 1;
}else{
return -1;
}
}


VB中的测试代码如下:

Private Declare Function TestArr Lib "ArrTest.dll" (nArr() As Long, ByVal nNewEle As Long) As Long

Private Sub Command1_Click()
Dim nArr() As Long, n As Long
n = TestArr(nArr, 15000)
Debug.Print n,
n = TestArr(nArr, 90)
Debug.Print n,
'n = TestArr(nArr, 600)
'Debug.Print n
End Sub


由于内存没有释放,VB中运行到TestArr(nArr, 600)时就崩溃了。
请问在DLL的代码中,原来(*VbArray)->pvData所指向的内存怎么释放?
...全文

相关推荐

评论 7
收藏 已收藏
分享
返回顶部
cs_dn_net
进程/线程/DLL 15,465 成员 49,169 内容