C++語言不允許您在分配引用後更改引用。不過,我有一個調試需求/願望來更改引用以幫助調試某些內容。是否有一種基本上用新指針覆蓋參考實現的方法?一旦你得到了一個你想改變的對象的地址,你可以將它轉換爲任何你想要的並覆蓋它。我無法弄清楚如何獲得底層參考實例的內存地址;使用&
來取消引用不會引用引用的地址,而是引用引用的對象的地址。如何更改C++引用(通過任何必要的方式)
我意識到這顯然會引發未定義的行爲,這只是一個實驗。第三方庫有一個全局引用的bug,在代碼執行之前沒有被構建,我想看看我是否可以通過自己設置引用來修復它。在這一點上,它成爲一個挑戰,看它是否有可能。我知道你可以用匯編語言來做這件事,如果你可以直接引用符號表。
我想像這樣。這些是全球範圍的變量。
Apple a;
Apple& ref = a;
後來我想ref
指一個新的對象實例b
並獨自離開a
。
Apple b;
ref = b; // that doesn't work. that justs sets a=b.
&ref = &b; // that doesn't work. the compiler complains.
uint64_t addr = find_symbol_by_any_means_necessary(ref);
*(Apple**)addr = &b; // this should work if I could get addr
請不要提醒我這是個壞主意。我知道這是一個壞主意。將其視爲挑戰。這僅用於調試,以便快速測試假設。我想了解一些關於C++二進制代碼內部的知識。 (請告訴我,如果系統頁面保護是不可能的,那麼如果引用被放置在神聖的地方,我可能會遇到seg故障)。
(系統是CentOS 7,編譯器是英特爾,雖然我可以使用gcc進行這個實驗)。
呃,你確定這不起作用嗎?試試這個代碼:'Apple a; Apple &a_ref; Apple b; a_ref = b;'用'Apple'類來監視它的拷貝構造,移動賦值等。我相當肯定你會發現'a_ref'現在指向'b';它不僅僅是複製數據。如果你做了'a = b',但你不是。 –
@QPaysTaxes,在引用上使用賦值運算符分配給被引用對象。 – chris
@QPaysTaxes:您提供的代碼示例不會編譯。 'Apple &a_ref;'無效。以下代碼:'Apple a; Apple&a_ref = a; a_ref = b;'等同於Apple a; a = b;' –