处理 IDL 序列返回类型的内存
Posted
技术标签:
【中文标题】处理 IDL 序列返回类型的内存【英文标题】:handling memory for IDL sequence return types 【发布时间】:2013-12-12 10:52:51 【问题描述】:我有一个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()?
【问题讨论】:
encryptId(&idToEncrypt.inout())
呢?
同时检查新的 IDL 到 C++11 语言的 CORBA 映射,其中 sequence您应该查看 CORBA 规范中的 _var
C++ mapping。
对于序列类型 var,我认为最好的方法可能是使用 inout()
成员,即:
ByteArray_var idToEncrypt = connection->get_id();
encryptId(&idToEncrypt.inout());
inout
返回一个非常量引用,而您只是使用&
获取底层对象的地址。
请注意:inout
确实取消了内部指针的引用,因此在不包含指针的 _var
上调用 inout()
是非法的。但是,对 get_id() 的调用 必须 始终返回一个有效的指针,因此代码无需检查即可。
如果您需要一个不知道 _var
是否已初始化的通用方法,您可以使用:
ByteArray* p = idToEncrypt.operator->();
因为operator->
似乎是直接获取指针的唯一方法。
【讨论】:
以上是关于处理 IDL 序列返回类型的内存的主要内容,如果未能解决你的问题,请参考以下文章