我有一个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 上调用
没有指针。但是,对 get_id() 的调用必须始终返回一个有效的指针,因此代码无需检查就可以。inout()
是非法的
如果您需要一种不知道 _var
是否已初始化的通用方法,您可以使用:
ByteArray* p = idToEncrypt.operator->();
因为 operator->
似乎是直接获取指针的唯一方法。
关于c++ - 处理 IDL 序列返回类型的内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20541478/