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

时间:2013-12-12 10:52:52

标签: c++ corba

我有一个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()?

1 个答案:

答案 0 :(得分:3)

您应该查看CORBA规范中的_var C++ mapping

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

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

inout返回一个非const引用,你只是用&获取底层对象的地址。

注意inout取消引用内部指针,因此在inout()上调用不存在指针的_var是非法的。但是,对get_id()的调用必须始终返回有效指针,因此代码没有检查就可以了。

如果您需要通用方法,而您不知道_var是否已初始化,则可以使用:

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

因为operator->似乎是直接获取指针的唯一方法。