C++ _ptr或_var-哪一个用作类字段,为什么?

C++ _ptr或_var-哪一个用作类字段,为什么?,c++,corba,idl,omniorb,C++,Corba,Idl,Omniorb,我有一门课: class Impl1 : public POA_I1 { private : Impl2_var ob; public : Impl2_ptr get(); { return ob; } void set(::Impl2_ptr ob) { this->ob = ob;

我有一门课:

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

          void set(::Impl2_ptr ob)
          {
             this->ob = ob;
          }
};
我对
\u ptr
\u var
有点困惑。我读到了

MyObject_var对象引用类型的_var版本用作 处理toproxy的方式与处理ptr引用的方式大致相同,但也增加了 内存管理。与所有的_var类型一样,一个_var引用负责 取消分配其基础实例(在本例中为代理 实例)当引用超出范围时。两个_ptr引用 和_var引用允许客户端访问代理上的操作 实例


但是我不明白什么时候使用每一个以及为什么使用。我的意思是,在我的实现中=我应该使用哪一个,
\u var
\u ptr
以及为什么?在类中有一个
\u var
类型的字段并在setter中返回
\u ptr
是否合法?我只是一点也不明白。

正如约翰尼指出的,这都是关于内存所有权的问题。如果将_ptr变量分配给_var变量,当_var变量超出范围时,内存将被删除,最好不要使用该_ptr变量


在您提供的情况下,当您调用
set
时,您给出的对象类型为
Impl1
指针的所有权。您仍然可以使用您拥有的代码,您可以调用<代码> IMP1::获取< /C> >,但由于您通过调用<代码> SET给出了该对象的所有权,如果对象被删除,那么该指针引用的内存也会被删除。

< P>当前的IDL到C++映射是相当困难和混乱的。像往常一样,查阅亨宁和维诺夫斯基的书

通常,对对象引用执行以下操作:

  • 始终将对象引用作为函数参数中的
    \u ptr
    类型传递
  • 但始终将它们(例如成员变量、局部变量)存储在
    \u var
    类型中

  • _var的行为类似于自动_ptr。通常我们使用_var作为成员,传递_ptr。您必须在正确的位置使用_duplicate(),这需要时间学习。另一个选项是IDL到C++11语言的映射,这更易于使用,有关更多详细信息,请参阅。我建议您检查omniORB附带的一些现有CORBA示例,例如TAO。看看人们是如何创建他们的测试并从中学习的。对于ptr/_var用法,还可以使用valgrind来确保没有任何内存泄漏。@Johnny Willemsen:是的,我看过orbzone.org,它看起来非常棒,在我看来,它比旧的映射更容易使用。我还有一个问题。将
    \u ptr
    分配给其他
    \u ptr
    合法吗?我已经读到,将
    \u var
    分配给
    \u var
    是非法的(我只需要使用
    \u duplicate()
    )就可以了),但我没有找到任何关于将
    \u ptr
    分配给
    \u ptr的信息。是的,我相信这是合法的。但我也认为将
    \u var
    分配给
    \u var
    是合法的,将_var分配给_var是合法的,但棘手的是,此时引用计数不会增加。此时使用_duplicate()是更常见的CORBA编程。也可以将_ptr分配给_ptr。好的,谢谢你的回答。因此,您建议在setter方法中使用
    \u duplicate()
    ,它将
    \u ptr
    作为参数,这比这要复杂一些<代码>\u var
    对象引用的类型实现引用计数。因此,当
    \u var
    类型超出范围时,引用计数将减少。只有当引用计数变为零时才会调用
    \u release
    。我认为您的一般规则#1仅适用于变量不在
    \u var
    中的情况,对吗?因为如果您从一个
    \u var
    中创建一个
    \u ptr
    ,并将
    \u ptr
    传递给放入本地
    \u var
    的某个对象,那么一旦某个对象的变量超出范围,原始的
    \u var
    就会被处理掉,否?@jhfrontz:您通常会将此与
    重复调用相结合,这样就不会发生这种情况。这基本上是为什么旧的C++映射是可怕的。什么是析构函数的代码< > VAR< <代码>知道它不应该破坏底层对象?
    \u var
    构造函数不知怎的知道
    \u ptr
    引用的对象在其他地方也被
    \u var
    引用,因此某个对象的
    \u var
    本质上增加了引用计数吗?哦,现在我想我看到了:
    \u var
    基本上是一个
    \u ptr
    ,隐含/自动引用在销毁时递减。