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

标签 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()?

最佳答案

你应该看看 _var C++ mapping在 CORBA 规范中。

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

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

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

请注意:inout 确实解引用了内部指针,因此在 _var 上调用 inout() 是非法的 没有指针。但是,对 get_id() 的调用必须始终返回一个有效的指针,因此代码无需检查就可以。

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

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

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

关于c++ - 处理 IDL 序列返回类型的内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20541478/

相关文章:

c++ - 将 IBM C++ 编译器从 xlc_R 10.0 升级到 11.1 后出现的问题

c++ - 是否可以在同一进程中拥有多个 ORB 对象?

c++ - 具有 corbaloc 访问权限的 MICO CORBA 服务器

C++:在链表中查找类的最大值

c++ - 如何避免强制转换运算符() 和访问运算符[] 冲突?

c++ - C/C++ 允许短路编译器优化

c++ - 无需重新编译即可更改 CORBA 接口(interface)

c++ - 根据用户输入控制插入BST

C++:尝试通过组合和帕斯卡三角来理解 constexpr

osgi - 在 OSGI 中使用 JACORB