I am new to C++ programming (work with Java mostly), and this behavior of C++ classes, member strings and string conversions to const char* with c_str() is confusing me.
I have a header, a class and main function as follows:
sample.h
class Sample
{
private:
    int id;
    std::string text;
public:
    Sample(int id);
    void setId(int id);
    int getId();
    void setText(std::string txt);
    std::string getText();
    void loadText();
    ~Sample();    
}
sample.cpp
Sample::Sample(int id)
{
    this->id = id;
}
void Sample::setId(int id)
{
    this->id = id;
}
int Sample::getId()
{
    return this->id;
}
void Sample::setText(std::string txt)
{
    this->text = txt;
}
std::string Sample::getText()
{
    return this->text;
}
void Sample::loadText()
{
    this->text = "Loaded";
}
Sample::~Sample()
{
    std::cout << "Destructor is called." << std::endl;
}
main.cpp
void main()
{
    int id = 1;
    Sample* sample = new Sample(id);
    // Case: 1 - If I do this, it does not work. Prints gibberish.
    sample->loadText();
    const char* text = sample->getText().c_str();
    std::cout << text << std::endl;
    // Case: 2 - Otherwise, this works.
    sample->loadText();
    std::cout << sample->getText().c_str() << std::endl;
    // Case: 3 - Or, this works
    sample->loadText();
    std::string txtCpy = sample->getText();
    const char* text = textCpy.c_str();
    std::cout << text << std::endl;
}
All three cases are done one at a time.
Case 3 does satisfy my use case (which is, passing the string to a C library that expects a const char*. But, I can't figure out the difference between Case: 1 and Case: 3? If we are returning the string by value, how does copying it to an intermediate variable make  it kosher for the run-time?
 
     
    