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

使用CORBA/TAO输出参数进行内存管理,corba,out-parameters,tao,Corba,Out Parameters,Tao,假设我有一个IDL函数: void foo(out Data d); 当我从生成的代码继承时,签名将如下所示: void foo(IDL::Data_out d); void Servant::foo(IDL::Data_out d) { d = new Data(); } IDL::Data* d(NULL); IDL::Data_out do(d); _servantRef->foo(do); delete d; 我的第一个问题是,我必须在客户端传递什么?我试过: IDL:

假设我有一个IDL函数:

void foo(out Data d);
当我从生成的代码继承时,签名将如下所示:

void foo(IDL::Data_out d);
void Servant::foo(IDL::Data_out d)
{
  d = new Data();
}
IDL::Data* d(NULL);
IDL::Data_out do(d);
_servantRef->foo(do);
delete d;
我的第一个问题是,我必须在客户端传递什么?我试过:

IDL::Data_out d;
_servantRef->foo(d);
但这不起作用,因为Data\u out没有默认构造函数。然后我试着:

IDL::Data* d;
_servantRef->foo(d);
但是现在编译器无法从IDL::Data*转换为IDL::Data\u out。以下操作可行,但看起来过于复杂,因此不正确:

IDL::Data* d(NULL);
IDL::Data_out do(d);
_servantRef->foo(do);
我必须如何从那里开始?在执行foo()的过程中,服务将在某个时候分配一个数据对象,如下所示:

void foo(IDL::Data_out d);
void Servant::foo(IDL::Data_out d)
{
  d = new Data();
}
IDL::Data* d(NULL);
IDL::Data_out do(d);
_servantRef->foo(do);
delete d;
在客户端使用对象后,我将删除该对象,如下所示:

void foo(IDL::Data_out d);
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::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::Data d;
_servantRef->foo (d);
void Servant::foo(IDL::Data& d)
{
  // modify d
}

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

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

IDL::Data_var d;
_servantRef->foo (d.out ());
void Servant::foo(IDL::Data_out d)
{
  d = new Data();
}
服务代码应该是

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::Data d;
_servantRef->foo (d);
void Servant::foo(IDL::Data& d)
{
  // modify d
}

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

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

如果您能提供一些帮助或文档指南,并以可理解的方式对此进行描述,我们将不胜感激

<>参见HeNe+VioSky.c/P>高级C++ CORBA编程
你也可以下载一份官方文件。IDL到C++11语言的映射是可用的

约翰尼·威伦森的回答很好。但你也问:

如果您能提供一些帮助或文档指南,并以可理解的方式对此进行描述,我们将不胜感激

<>参见HeNe+VioSky.c/P>高级C++ CORBA编程 你也可以下载一份官方文件。IDL到C++11语言的映射是可用的