首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CORBA/TAO参数的内存管理

CORBA/TAO参数的内存管理
EN

Stack Overflow用户
提问于 2014-06-26 14:54:42
回答 2查看 1K关注 0票数 1

假设我有一个IDL函数:

代码语言:javascript
复制
void foo(out Data d);

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

代码语言:javascript
复制
void foo(IDL::Data_out d);

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

代码语言:javascript
复制
IDL::Data_out d;
_servantRef->foo(d);

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

代码语言:javascript
复制
IDL::Data* d;
_servantRef->foo(d);

但是现在编译器不能将IDL::Data*转换为IDL::Data_out。以下内容很有效,但看起来过于复杂,因此不正确:

代码语言:javascript
复制
IDL::Data* d(NULL);
IDL::Data_out do(d);
_servantRef->foo(do);

从那开始我该怎么做?在foo()的执行过程中,服务将在某个时候分配一个数据对象,如下所示:

代码语言:javascript
复制
void Servant::foo(IDL::Data_out d)
{
  d = new Data();
}

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

代码语言:javascript
复制
IDL::Data* d(NULL);
IDL::Data_out do(d);
_servantRef->foo(do);
delete d;

这至少是正确的想法,还是工作方式不同?如果能以一种可以理解的方式对文档进行描述,希望能得到一些帮助或提示。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-06-26 17:17:58

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

代码语言:javascript
复制
IDL::Data_var d;
_servantRef->foo (d.out ());

服务代码应该是

代码语言:javascript
复制
void Servant::foo(IDL::Data_out d)
{
  d = new Data();
}

新的IDL到C++11语言映射使这种方法更容易,客户机代码是

代码语言:javascript
复制
IDL::Data d;
_servantRef->foo (d);

仆人代码是

代码语言:javascript
复制
void Servant::foo(IDL::Data& d)
{
  // modify d
}

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

票数 4
EN

Stack Overflow用户

发布于 2014-06-27 14:35:55

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

如果能以一种可以理解的方式对文档进行描述,希望能得到一些帮助或提示。

参见Henning & Vinoski著的“使用C++进行高级CORBA编程”一书。

您还可以下载官方从IDL到C++语言映射文档的副本。IDL到C++11语言的映射是可用的这里

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24433768

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档