Если я правильно интерпретирую ссылки на С++, они похожи на указатели, но с гарантированной целостностью данных (нет NULL, no (int *) 0x12345). Но что происходит, когда область ссылочного объекта выделена? Если нет волшебства (и, вероятно, это не так), ссылочный объект будет уничтожен за моей спиной.
Я написал фрагмент кода, чтобы проверить это:
#include <iostream>
using namespace std;
class A {
public:
A(int k) { _k = k; };
int get() { return _k; };
int _k;
};
class B {
public:
B(A& a) : _a(a) {}
void b() { cout << _a.get(); }
A& _a;
};
B* f() {
A a(10);
return new B(a);
}
int main() {
f()->b();
}
Для проверки существования фрейма стека была вставлена переменная экземпляра _k
.
Это неожиданно не segfault и вместо этого печатает "10" правильно, в то время как я полагаю, что A
выделяется в стеке, и кадр стека f()
будет перезаписан по меньшей мере вызовом cout<<
.