Reputation: 27694
The following is an in-lined(defined inside header file) static member function. Is the literal string "MyClass" always guaranteed to be in static memory? If not, will this not be returning a pointer in stack?
const char * className()
{
return "MyClass";
}
Edit:
How about this?
const RWCString& className()
{
return "MyClass";
}
RWCString
is an string class which has a implicit constructor which takes a const char*
.
http://www.roguewave.com/portals/0/products/sourcepro/docs/11/html/toolsref/rwcstring.html
Upvotes: 0
Views: 172
Reputation: 300439
The first example:
const char * className()
{
return "MyClass";
}
is fine. "MyClass"
is a literal of type char const[8]
which lifetime begins before your code is invoked and ends after your code is done, so no issue.
The second example, however, will not work.
const RWCString& className()
{
return "MyClass";
}
It requires and object of type RWCString
to be constructed within the function in order to be able to return a reference to it. However what is built as a local variable or temporary within a function cannot be returned by reference, so you get undefined behavior (if it compiles).
You can very simply turn it into a "good" function though:
const RWCString& className()
{
static RWCString const N = "MyClass";
return N;
}
Here I create a local static object N
which will be constructed the first time the function is called. Because it is static
its lifetime extends past the call so it is fine to return a reference to it.
EDIT: as Steve pointed out, temporary is more appropriate that local variable here.
Upvotes: 5
Reputation: 471567
Nope. This is completely defined. The string isn't on the stack. It's in global memory. So the pointer it returns is valid. (even better: you declared it const
)
Upvotes: 5