COM编程:Sys系列字符串引用计数函数调用顺序问题咨询
BSTR引用计数与调用顺序问题解答
核心问题解答
当原所有者类在其他类调用SysReleaseString之前调用SysFreeString,不会引发问题。原因是:
SysAllocString创建的BSTR初始引用计数为1,其他类调用SysAddRefString后计数变为2。SysFreeString的本质是递减BSTR的引用计数,只有当计数降至0时才会释放内存。此时调用SysFreeString只会将计数从2减到1,内存不会被释放,直到其他类调用SysReleaseString将计数降至0,内存才会被正确释放。
调用顺序的可行性
第一种顺序
SysAllocString SysAddRefString SysReleaseString SysFreeString
这是符合规范的安全顺序,每一次引用增加(SysAddRefString)对应一次引用减少(SysReleaseString),初始分配的BSTR由原所有者通过SysFreeString最终释放,逻辑清晰且容易维护。
第二种顺序
SysAllocString SysAddRefString SysFreeString (内存未释放) SysReleaseString (内存实际在此处释放)
这种顺序完全可行,没有潜在问题。因为SysFreeString和SysReleaseString的核心行为一致:都是递减引用计数,计数归零时释放内存。该顺序的计数变化为:1(分配)→2(加引用)→1(Free减引用)→0(Release减引用),最终内存会被正确释放,不会出现泄漏或野指针问题。
关键注意事项
无论采用哪种顺序,必须保证引用计数的增减平衡:
- 不能出现
SysAddRefString的调用次数多于SysReleaseString/SysFreeString的总和,否则会导致内存泄漏。 - 不能出现
SysReleaseString/SysFreeString的调用次数多于SysAllocString+SysAddRefString的总和,否则会触发非法内存访问错误。
内容的提问来源于stack exchange,提问作者drgs
相关产品推荐
相关产品推荐

