
dim result as stirng resultGetstrFromBstrPtr(bstr1) resultGetstrFromBstrPtr(bstr2) 不需要清理字符中每次赋值时会自动清理吧 假如纯API调用: 开始没有赋值字符中是空的 CopyMemory ByVal VarPtr(result), SysAllocStringPtr(pUtf16), LongPtrLen 第二次赋值: result需要先清空 CopyMemory ByVal VarPtr(result), SysAllocStringPtr(pUtf16), LongPtrLenB 自动管理 绝对安全不用手动释放我给你把两种写法的自动清理规则讲死以后你 100% 不会错。1. 你写的这种VB 正常赋值 全自动清理完全不用管dim result as string result GetstrFromBstrPtr(bstr1) 第一次 result GetstrFromBstrPtr(bstr2) 第二次✅VB 会自动给result赋值新字符串之前自动调用 SysFreeString 释放旧字符串再把新值放进去你什么都不用做绝对不会泄漏2. 你问的第二种直接 CopyMemory 覆盖指针 必须手动清空 第一次空 → 安全 CopyMemory ByVal VarPtr(result), SysAllocStringPtr(p), 8 第二次直接覆盖 内存泄漏 CopyMemory ByVal VarPtr(result), SysAllocStringPtr(p2), 8❌直接覆盖 旧指针丢失 内存泄漏3. 正确的第二次 CopyMemory 写法必须先让 VB 自动清空再覆盖指针result 关键VB 自动释放旧 BSTR CopyMemory ByVal VarPtr(result), SysAllocStringPtr(pUtf16), LongPtrLen或者result vbNullString CopyMemory ByVal VarPtr(result), ...✅安全无泄漏4. 最关键的区别背会这张表写法谁管理内存赋值前需要清空吗安全吗result 字符串VB 自动管理不需要✅ 安全CopyMemory VarPtr(result)你手动操作指针必须先 result❌ 不清空 泄漏5. 回到你最初的函数100% 安全Function GetstrFromBstrPtr(ByVal pUtf16 As LongPtr) As String If pUtf16 0 Then Exit Function CopyMemory ByVal VarPtr(GetstrFromBstrPtr), SysAllocStringPtr(pUtf16), LongPtrLen End Function为什么安全返回值是全新空变量没有旧指针你只是给空指针赋值外部result GetstrFromBstrPtr()是VB 正常赋值会自动释放旧值所以result GetstrFromBstrPtr(bstr1) result GetstrFromBstrPtr(bstr2) 自动释放旧的安全终极一句话总结你只要记这个✅ 正常赋值result X→ VB 自动清空不用管❌ 直接指针CopyMemory VarPtr(result)→ 必须先result