处理 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(&amp;idToEncrypt.inout()) 呢? 同时检查新的 IDL 到 C++11 语言的 CORBA 映射,其中 sequence 映射到 std::vector ,它使用 C++11 移动语义按值返回. 【参考方案1】:

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

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

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

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

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

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

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

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

【讨论】:

以上是关于处理 IDL 序列返回类型的内存的主要内容,如果未能解决你的问题,请参考以下文章

ATL/COM : 在 IDL 文件中我们可以创建一个可以用作返回类型的类

怎么把二进制icesat glas数据文件读入电脑内存

IDL 到类型库

内存操作函数

C# 中内存占用最低的最快的序列化器和反序列化器?

Python 列表内存浅析