处理IDL序列返回类型的内存

handling memory for IDL sequence return types

本文关键字:内存 返回类型 IDL 处理      更新时间:2023-10-16

我有一个idl定义,如下

typedef sequence<octet> ByteArray;
interface Connection {
    ByteArray get_id ();
}

还有这个客户端代码

ByteArray * idToEncrypt = connection->get_id();
encryptId(idToEncrypt); 
... // rest of code

函数encryptId()具有签名ByteArray* encryptId(ByteArray* idToEncrypt)。我不能更改这个签名。

对于自动内存处理,idToEncrypt的类型已更改为ByteArray_var。问题是我不知道如何从ByteArray_var中获取"ByteArray*"并将其传递给encryptId()。

有没有一种方法可以自动处理分配的内存"idToEncrypt",并将其作为"ByteArray*"传递给encryptId()?

您应该查看CORBA规范中的_varC++映射。

对于序列类型var,我认为最好的方法可能是使用inout()成员,即:

ByteArray_var idToEncrypt = connection->get_id();
encryptId(&idToEncrypt.inout()); 

inout返回一个非常数引用,而您只是用&获取底层对象的地址。

请注意inout确实取消引用内部指针,因此在不包含指针的_var上调用inout()是非法的。但是,对get_id()的调用必须始终返回一个有效的指针,因此代码在不检查的情况下是可以的。

如果您需要一种不知道_var是否初始化的通用方法,可以使用:

ByteArray* p = idToEncrypt.operator->();

因为CCD_ 10似乎是直接获取指针的唯一方式。