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
,隐含/自动引用在销毁时递减。