2010-04-28 49 views
5

我们有以下接口:COM服务器是否必须为[out]参数调用SysFreeString()?

[object, uuid("uuidhere"), dual ] 
interface IInterface : IDispatch 
{ 
    [id(1), propget] HRESULT CoolProperty([out, retval] BSTR* result); 
} 

现在有一个小问题。一方面参数是“out”,所以任何值都可以作为输入传递,参数只有在成功返回时才有效。另一方面,有this MSDN article从许多页面链接到基本上说(最后一段),如果任何函数通过BSTR*它必须释放字符串之前分配一个新的字符串。

这很可怕。如果这篇文章是正确的,这意味着所有的调用者都必须通过有效的BSTRs(可能是空BSTRs),否则BSTR传递可能会泄露。如果调用者传递了一个随机值并且被调用者试图调用SysFreeString()它会遇到未定义的行为,因此约定很关键。

那么[out]属性有什么意义呢?在这种情况下,[in, out][out]之间有什么区别?

该文章对不对?在分配新参数之前,我需要释放通过的BSTR [out]参数吗?

回答

4

您应该期望客户端遵循合同,遵守[out]属性并且不通过需要释放的初始化BSTR。仔细检查和预期NULL是而不是好的,合同不要求客户端将指针传递到初始化的内存位置。你通常会得到一个指向堆栈帧中分配的BSTR变量的指针。它可能包含随机垃圾,只有防守程序员会将其设置为NULL。

它在其他方面与OLE自动化不兼容。在这种情况下只有[out,retval]和[in,out]是有效的,无疑是为了避免这个特殊的陷阱。

3

documentation指出,OUT指针不应该被被调用者释放,因此,恕我直言,你会更好地遵守规范。

最好

相关问题