3

我有一堂课:

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

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

我对_ptrand有点困惑_var。我读到了

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

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

4

2 回答 2

3

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

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

于 2012-08-13T20:54:15.630 回答
1

当前 IDL 到 C++ 的映射非常困难和混乱。与往常一样,请参阅 Henning & Vinowski 的书。

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

  1. 始终将对象引用作为_ptr函数参数中的类型传递。
  2. 但始终将它们(例如成员变量、局部变量)存储在_var类型中。
于 2012-08-14T23:41:10.057 回答