On Wed, 19 Apr 2017 01:40:39 -0700 (PDT)
Frits van Bommel <fvbom...@gmail.com> wrote:

> On Wednesday, April 19, 2017 at 9:10:16 AM UTC+2, hui zhang wrote:
> >
> > for  1) you mean 
> >>
> >> char *CGetPath() {
> >>     return getpath().c_str();
> >>   }
> >
> >
> > this code will work ?
> >
> 
> That depends on whether getpath() returns a std::string or a (const) 
> std::string& (a (const) reference). It will work if it returns a
> reference or const reference, but is not guaranteed to work if it
> doesn't (though it may appear to do so in some cases, or for some
> implementations of the C++ standard lib) because the standard lib is
> not required to use a reference-counted dynamic array. For example,
> it might instead choose to copy the array every time or to allocate
> small strings using an in-object buffer to avoid the overhead of
> dynamic allocation, and in both of those cases the return value of
> c_str() is no longer valid when the function returns.

I think that [1] guarantees that it's perfectly OK to return the value
returned by c_str() from a function unless the object we've called
c_str() on gets destructed upon that return (i.e. it was an automatic
or "RAII-d" variable in that function).  That is, if the OP can
guarantee that the std::string object being discussed was live at the
time getpath() was called and is live after that call was finished,
it's fine to use whatever c_str() returned.

To cite [1] once again:

| The pointer obtained from c_str() may be invalidated by:
| * Passing a non-const reference to the string to any standard library
|   function, or
| * Calling non-const member functions on the string, excluding
|   operator[], at(), front(), back(), begin(), rbegin(), end() and
|   rend().

> Even better might be to call GoString(getpath().c_str()) in
> the CGetPath function to ensure only a single copy is made, but I'm
> not familiar enough with cgo to know if that's possible.

Unfortunately, that's not possible: cgo can be thought of as providing
some sort of API for both sides -- the C's and the Go's and allowing
them both to interact via those APIs.  It's impossible to arbitrarily
mix and match C and Go sides in expressions, so you'll have to arm your
C side with a function which would do getpath().c_str() and call it to
produce an input value for GoString().  But this actually changes
nothing in the semantics in this particular case -- see above.

1. http://en.cppreference.com/w/cpp/string/basic_string/c_str

-- 
You received this message because you are subscribed to the Google Groups 
"golang-nuts" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to golang-nuts+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to