使用CORBA/TAO输出参数的内存管理



假设我有一个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()期间,服务将在某个时候分配一个数据对象,如下所示:

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

在客户端使用对象后,我将像这样删除它:

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

这至少是正确的想法,还是它的工作方式不同?如果能在文档中以一种可理解的方式描述这一点,我将不胜感激。

您必须正确使用_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。

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

如果能以一种可理解的方式描述这一点,我将非常感激。

参见Henning &的Advanced CORBA Programming with c++ 一书。Vinoski .

您还可以在这里下载官方IDL到c++语言映射文档的副本。这里提供了IDL到c++ 11语言的映射。

相关内容

  • 没有找到相关文章

最新更新