VB6字符串指针高效编程,无内存泄露

vbnet 复制代码
dim result as stirng
result=GetstrFromBstrPtr(bstr1)
result=GetstrFromBstrPtr(bstr2)
'不需要清理字符中,每次赋值时会自动清理吧
假如纯API调用:
'开始没有赋值,字符中是空的
 CopyMemory ByVal VarPtr(result), SysAllocStringPtr(pUtf16), LongPtrLen
第二次赋值:
result=""'需要先清空
 CopyMemory ByVal VarPtr(result), SysAllocStringPtr(pUtf16), LongPtrLen

B 自动管理 = 绝对安全,不用手动释放

我给你把两种写法的自动清理规则讲死,以后你 100% 不会错。


1. 你写的这种:VB 正常赋值 = 全自动清理,完全不用管

复制代码
dim result as string
result = GetstrFromBstrPtr(bstr1)  ' 第一次
result = GetstrFromBstrPtr(bstr2)  ' 第二次

✅ VB 会自动:

  1. 给 result 赋值新字符串之前
  2. 自动调用 SysFreeString 释放旧字符串
  3. 再把新值放进去

你什么都不用做,绝对不会泄漏!


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 = ""

相关推荐
程序员大阳7 小时前
副队长JavaScript教程(49)-主动抛出异常与错误类型
javascript·异常处理·error·throw·错误类型
古法老登瞎折腾7 小时前
大数据智能运维实战(十一):运维 MCP 的工程化——权限、限流、审计与错误处理
java·大数据·运维·spring ai·mcp
hhhjhl7 小时前
Protobuf.js 跨端三方库仓颉适配全流程
javascript·网络·udp
康小汪7 小时前
AI 写 Vue 总写成同一个味道:给它装 Skills,装的不是知识是边界
前端·vue.js·人工智能·ai编程·最佳实践
智能运维指南8 小时前
研制过程“两张皮“怎么破:研制一体化支撑平台的定位、能力边界与落地前提
java·前端·人工智能·嘉为蓝鲸
yz_aiks9 小时前
Spring AI 2.1 ChatMemory 已过时用什么替代:迁移到 Session Memory 实战(JDBC 存储与会话压缩)
java·spring boot·大模型·ai agent·spring ai
金銀銅鐵9 小时前
[Java] 用 GUI 展示 EnumMap 增删键值对时的内部变化
java·后端·ai编程
学长毕设9 小时前
基于SpringBoot的上门洗车服务系统设计与实现
java·spring boot·后端
jason成都9 小时前
RTKLIB-Java 多基线联合RTK:FIX率从0%到91.5%的三层根因修复
java·gnss·rtklib·rtklib_java
鱼宵9 小时前
Stream 终端操作一次讲透:collect、count、reduce 怎么选
java·stream·终端操作