【问题标题】:_ptr or _var - which one use as a class field and why?_ptr 或 _var - 哪一个用作类字段,为什么?
【发布时间】:2012-08-09 21:42:45
【问题描述】:

我有一堂课:

class Impl1 : public POA_I1
{
   private :
          Impl2_var ob;
   public :
          Impl2_ptr get();
          {
             return ob;
          }

          void set(::Impl2_ptr ob)
          {
             this->ob = ob;
          }
};

我对@9​​87654323@ 和_var 有点困惑。我读到了

MyObject_var 对象引用类型的 _var 版本充当 以与 _ptr 引用大致相同的方式处理 toproxy,但还添加了 内存管理。像所有 _var 类型一样,一个 _var 引用负责 释放其底层实例(在这种情况下,代理 实例)当引用超出范围时。两个 _ptr 引用 和 _var 引用允许客户端访问代理上的操作 实例

但我不明白何时使用每个以及为什么。我的意思是,在我的实现中 = 我应该使用哪一个,_var_ptr,为什么?在类中拥有_var 类型的字段并在setter 中返回_ptr 是否合法?我只是不明白。

【问题讨论】:

  • _var 的行为类似于 auto_ptr。通常我们使用 _var 作为成员,传递 _ptr。您必须在正确的地方使用 _duplicate(),这需要时间来学习。另一种选择是 IDL 到 C++11 语言的映射,它更易于使用,有关更多详细信息,请参阅orbzone.org
  • 我建议您检查一些现有的 CORBA 示例,这些示例随omniORB 或例如TAO 一起提供。了解人们如何创建测试并从中学习。对于 _ptr/_var 的使用,也可以与 valgrind 一起运行,以确保您没有任何内存泄漏。
  • @Johnny Willemsen:是的,我看过 orbzone.org,它看起来非常棒,而且 imo 比旧映射更容易使用。我还有一个问题。将_ptr 分配给其他_ptr 是否合法?我读过将_var 分配给_var 是非法的(我只需要使用_duplicate() 来做)但我没有发现任何关于将_ptr 分配给_ptr
  • 是的,我相信这是合法的。但我也认为将_var 分配给_var 是合法的
  • 将 _var 分配给 _var 是合法的,但棘手的部分是此时引用计数不会增加。在那个时候使用 _duplicate() 是更常见的 CORBA 编程。也允许将 _ptr 分配给 _ptr。

标签: c++ corba idl omniorb


【解决方案1】:

正如 Johnny 所指出的,这完全与内存所有权有关。如果您将 _ptr 变量分配给 _var 变量,当 _var 变量超出范围时,内存将被删除,您最好不要使用该 _ptr 变量。

在您提供的情况下,当您调用set 时,您将授予Impl1 类型的对象指针的所有权。您仍然可以使用现有的,您可以调用Impl1::get,但由于您通过调用set 授予了该_ptr 的对象所有权,如果该对象被删除,那么该指针引用的内存也会被删除。

【讨论】:

  • 好的,谢谢您的回答。因此,您建议在 setter 方法中使用 _duplicate(),它以 _ptr? 为参数?
  • 比这要复杂一些。 _var 对象引用的类型实现了引用计数。因此,当 _var 类型超出范围时,引用计数会减少。只有当引用计数变为零时才会调用_release
【解决方案2】:

当前 IDL 到 C++ 的映射非常困难且令人困惑。与往常一样,请参阅 Henning & Vinowski 的书。

一般来说,对对象引用执行此操作:

  1. 始终将对象引用作为_ptr 类型传递给函数参数。
  2. 但始终将它们(例如成员变量、局部变量)存储在 _var 类型中。

【讨论】:

  • 我认为您的一般规则 #1 仅适用于变量不在 _var 中的情况,对吧?因为如果您从_var 创建一个_ptr 并将_ptr 传递给某个放入本地_var 的东西,那么一旦某个东西的变量超出范围,原来的_var 就会被冲洗掉,没有?
  • @jhfrontz:您通常将此与duplicate 调用结合使用,这样就不会发生这种情况。这基本上就是为什么旧的 C++ 映射很糟糕的原因。
  • _var 的析构函数如何知道它不应该破坏底层对象? _var 构造函数是否知道 _ptr 引用的对象也被 _var 在其他地方引用,因此 _var 本质上是在增加引用计数?
  • 哦,现在我想我明白了:_var 基本上是 _ptr,在销毁时隐含/自动引用递减。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-30
  • 2013-05-05
  • 2021-06-06
  • 2015-04-15
相关资源
最近更新 更多