我有一个类:
class Impl1 : public POA_I1
{
private :
Impl2_var ob;
public :
Impl2_ptr get();
{
return ob;
}
void set(::Impl2_ptr ob)
{
this->ob = ob;
}
};
我对_ptr
和_var
有点困惑.我读过
MyObject_var 对象引用类型的_var版本充当 以与_ptr引用大致相同的方式处理代理,但也添加了 内存管理。与所有_var类型一样,_var引用负责 解除分配其基础实例(在本例中为代理 实例),当引用超出范围时。两个_ptr参考文献 和_var引用允许客户端访问代理上的操作 实例
但我不明白何时使用每个以及为什么。我的意思是,在我的实现中=我应该使用哪一个,_var
还是_ptr
,为什么?在类中有一个 _var
类型的字段并在 setter 中返回_ptr
是否合法?我只是根本不明白。
正如约翰尼指出的那样,这一切都与内存所有权有关。如果将_ptr变量分配给_var变量,则当_var变量超出范围时,内存将被删除,最好不要使用该_ptr变量。
在您提供的情况下,当您调用set
时,您将为指针类型Impl1
的对象提供所有权。 您仍然可以使用您拥有的那个,您可以调用Impl1::get
但是由于您通过调用set
赋予了该_ptr的对象所有权,如果该对象被删除,则该指针引用的内存也会被删除。
当前的 IDL 到 C++ 映射非常困难且令人困惑。与往常一样,请查阅Henning&Vinowski的书。
通常,对对象引用执行此操作:
- 始终在函数参数中将对象引用作为
_ptr
类型传递。 - 但始终将它们(例如成员变量、局部变量)存储在
_var
类型中。