如何释放封装在VARIANT中的IDL用户定义结构的成员(即BSTR,SAFEARRAY,VARIANT)?

时间:2010-04-18 12:22:18

标签: visual-c++ com mfc atl com+

我有一个在IDL中定义的结构。该结构具有以下成员:


{
    BSTR m_sFirst;
    BSTR m_sSecond;
    VARIANT m_vChildStruct; //This member encapsulate a sub structure 
    SAFEARRAY __RPC_FAR * m_saArray;
}CustomINFO;

我使用CoTaskMemAlloc为结构分配内存并将其封装在Variant中,如下所示:



vV->vt = VT_RECORD;
vV->pvRecord = pStruct; //Pointer of sturct
vV->pRecInfo = pRI; //RecordInfo Interface

是否足以调用VariantClear来释放struct及其成员的内存? 它还会发布IRecordInfo接口吗?

或者我必须手动获取封装的struct并自行释放每个成员,然后使用CoTaskMemFree释放sturct。

由于

Picaro De Vosio

1 个答案:

答案 0 :(得分:1)

VariantClear将调用IRecordInfo::Clear,它释放结构成员持有的内存,但据说不会释放结构本身(这就是为什么你不能正确返回结构中的结构{ {1}})。 IRecordInfo也应该被释放。

(“应该”表示“否则,许多现有代码会破坏/被破坏”)。

此处提供更多信息:http://vcfaq.mvps.org/com/4.htm