【问题标题】:Memory management with CORBA/TAO out parameters使用 CORBA/TAO 输出参数进行内存管理
【发布时间】:2014-06-26 14:54:42
【问题描述】:

假设我有一个 IDL 函数:

void foo(out Data d);

当我从生成的代码继承时,签名将如下所示:

void foo(IDL::Data_out d);

我的第一个问题是,我必须在客户端传递什么?我试过了:

IDL::Data_out d;
_servantRef->foo(d);

但这不起作用,因为 Data_out 没有默认构造函数。然后我尝试了:

IDL::Data* d;
_servantRef->foo(d);

但现在编译器无法从 IDL::Data* 转换为 IDL::Data_out。以下工作,但看起来过于复杂,因此不正确:

IDL::Data* d(NULL);
IDL::Data_out do(d);
_servantRef->foo(do);

我该如何从那里开始?在执行 foo() 期间,servant 将在某个时候分配一个数据对象,如下所示:

void Servant::foo(IDL::Data_out d)
{
  d = new Data();
}

我将在客户端使用后删除该对象,如下所示:

IDL::Data* d(NULL);
IDL::Data_out do(d);
_servantRef->foo(do);
delete d;

这至少从它的想法来看是正确的,还是有不同的工作方式?希望能提供一些帮助或指向以易于理解的方式描述的文档。

【问题讨论】:

    标签: corba out-parameters tao


    【解决方案1】:

    您必须正确使用 _var 类,它们就像一个 auto_ptr 并确保在 _var 超出范围时释放内存。客户端代码应该是

    IDL::Data_var d;
    _servantRef->foo (d.out ());
    

    仆人代码应该是

    void Servant::foo(IDL::Data_out d)
    {
      d = new Data();
    }
    

    新的 IDL 到 C++11 语言的映射使这种方式更容易,客户端代码就在那里

    IDL::Data d;
    _servantRef->foo (d);
    

    仆人代码是

    void Servant::foo(IDL::Data& d)
    {
      // modify d
    }
    

    有关 IDL 到 C++11 的更多详细信息,请参阅 TAOX11

    【讨论】:

      【解决方案2】:

      Johnny Willemsen 的回答很好。但你也问:

      希望能提供一些帮助或指向以易于理解的方式描述的文档。

      请参阅 Henning & Vinoski 所著的Advanced CORBA Programming with C++一书。

      您也可以下载官方IDL to C++ language mapping document here的副本。 IDL 到 C++11 语言映射可用here

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-08-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多