[Trilinos-Users] Teuchos::RCP Call by reference

Bartlett, Roscoe A. bartlettra at ornl.gov
Thu Aug 8 17:47:00 MDT 2013


For what it is worth ...

I like Mark's version returning the new RCP<Epetra_MultiVector> by value better than setting it in the formal parameters.

-Ross

> -----Original Message-----
> From: trilinos-users-bounces at software.sandia.gov [mailto:trilinos-users-
> bounces at software.sandia.gov] On Behalf Of Hoemmen, Mark
> Sent: Thursday, August 08, 2013 7:36 PM
> To: <trilinos-users at software.sandia.gov>
> Cc: Sunghwan Choi
> Subject: Re: [Trilinos-Users] Teuchos::RCP Call by reference
> 
> On Aug 8, 2013, at 12:00 PM, <trilinos-users-request at software.sandia.gov>
>  <trilinos-users-request at software.sandia.gov> wrote:
> > Message: 1
> > Date: Fri, 9 Aug 2013 00:38:34 +0900
> > From: "Sunghwan Choi" <iomn159753 at kaist.ac.kr>
> > Subject: [Trilinos-Users] Teucho::RCP Call by reference
> > To: trilinos-users at software.sandia.gov
> > Message-ID: <1b9a01ce944d$58b45910$0a1d0b30$@kaist.ac.kr>
> > Content-Type: text/plain; charset="us-ascii"
> >
> > Dear all,
> >
> > Hi I met a weird situation. I computed scaling of Epetra_MultiVector in a
> > function and I got it through 'call by reference' I check the Scale does do
> > its work but outside of function the value was not changed. I wrote pseudo
> > code
> >
> >
> >
> > int func(Teuchos::RCP<Epetra_MultiVector>
> > before_values,Teuchos::RCP<Epetra_MultiVector> after_values){
> >
> > after_values = Teuchos::rcp(new Epetra_MultiVector(*before_values) );
> >
> >            double scaling = 0.5;
> >
> > cout <<"before values" <<endl;
> >
> >            cout << *after_values <<endl;
> >
> >            after_values->Scale(1.0/scaling) ;
> >
> >            cout <<"after values" <<endl;
> >
> >            cout << *after_values<<endl;
> >
> >            return;
> >
> > }
> >
> >
> >
> > This is super simple code but I don't know why it is not working. In other
> > part of my code, I used call-by-reference using Teuchos::RCP but this is not
> > working. Do you have any idea on this situation?
> 
> This is not "call by reference"; this is "call by pointer."  Imagine replacing the
> RCP with a raw pointer, like this:
> 
> int
> func (Epetra_MultiVector* before_values,
>       Epetra_MultiVector* after_values)
> {
>   after_values = new Epetra_MultiVector (*before_values);
>   double scaling = 0.5;
>   after_values->Scale (1.0 / scaling);
>   return 0; // your function returns int
> }
> 
> This function would have the same problem as your function above (in
> addition to the problem of leaking memory).  (The only difference between
> an RCP and a raw pointer is that RCP handles deallocation safely.)  If you want
> to change the _pointer_, you either need to pass in the RCP _itself_ by
> nonconst reference ("RCP<Epetra_MultiVector>&"), or you need to return
> the RCP.  I recommend the latter.  I also recommend passing before_values
> by const reference, since the function doesn't need to keep it:
> 
> RCP<Epetra_MultiVector>
> func (const Epetra_MultiVector& before_values)
> {
>   RCP<Epetra_MultiVector> after_values = rcp (new Epetra_MultiVector
> (before_values));
>   double scaling = 0.5;
>   after_values->Scale (1.0 / scaling);
>   return after_values;
> }
> 
> mfh
> _______________________________________________
> Trilinos-Users mailing list
> Trilinos-Users at software.sandia.gov
> http://software.sandia.gov/mailman/listinfo/trilinos-users




More information about the Trilinos-Users mailing list