看看這段代碼。這個std :: cout最終會打印垃圾還是意想不到的東西?
class Obj{
public:
int id;
Obj(int id) : id(id){}
};
int main()
{
std::vector<Obj> v;
for(int i=0; i<3; i++) // add some elements
v.push_back(Obj(i));
Obj& ref = v[2]; // grab references (two ways)
Obj* ref_bad = &v[2];
for(int i=3; i<100000; i++) // make the vector re-allocate
v.push_back(Obj(i));
std::cout << ref.id << std::endl; // prints 2
std::cout << (*ref_bad).id << std::endl; // prints 2, but always?
return 0;
}
這個簡單的代碼打印2
在這兩種情況下,但我不知道這是否會爲每一個可能的執行行爲。
由於矢量在某一點重新分配(當然,不一定總是取決於操作系統的段管理決策),不應該在一個點上打印失敗嗎?
我在不同的點上使用printf
和%p
打印指針,值不同,但我不完全理解C++的真實引用的行爲;這樣做總是安全的嗎? (使C++參考某些可能會改變其內存位置的東西)
引用和指針變得懸空,所以行爲是不確定的。 – songyuanyao