【问题标题】:handling memory for IDL sequence return types处理 IDL 序列返回类型的内存
【发布时间】: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 移动语义按值返回.

标签: c++ corba


【解决方案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; 似乎是直接获取指针的唯一方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-30
    • 2021-08-28
    • 2020-06-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多