I have the following code which compiles with no warnings (-Wall -pedantic) with g++
#include <iostream>
#include <string>
using namespace std;
class Foo
{
public:
Foo(const std::string& s) : str(s)
{ }
void print()
{
cout << str << endl;
}
private:
const std::string& str;
};
class Bar
{
public:
void stuff()
{
Foo o("werd");
o.print();
}
};
int main(int argc, char **argv)
{
Bar b;
b.stuff();
return 0;
}
But when I run it, only the newline is printed out. What is going on?
If I were to do this inside stuff:
string temp("snoop");
Foo f(temp);
f.print();
then it works fine!
Best Answer
The reason why this fails is because it essentially compiles to the following under the hood.
In this case the
Foo
value is taking a reference to a temporary object which is deleted after the constructor completes. Hence it's holding onto a dead value. The second version works because it's holding a reference to a local which has a greater lifetime than theFoo
instance.To fix this change the memebr from being a
const std::string&
to aconst std::string
.