Нет, все не в порядке. Локальные переменные объявляются в стеке, и стек продолжает меняться между вызовами методов. Кроме того, объекты, которые выходят из области видимости, уничтожаются. Всегда возвращайте копию локальной переменной.
Рассмотрим этот код:
#include <iostream>
using namespace std;
class MyClass
{
public:
MyClass() { cout << "ctor" << endl; }
~MyClass() { cout << "dtor" << endl; }
MyClass(const MyClass& r) { cout << "copy" << endl; }
};
const MyClass& Test()
{
MyClass m;
return m;
}
int main()
{
cout << "before Test" << endl;
MyClass m = Test();
cout << "after Test" << endl;
}
Это распечатает:
before Test
ctor
dtor
copy
after Test
dtor
Объект, который вы пытаетесь скопировать, уже вызвал деструктор и может находиться в недопустимом состоянии.