C++言語では、参照が割り当てられた後で変更することはできません。しかし、私はデバッグの必要性がありました/何かをデバッグするための参照を変更する必要があります。基本的にリファレンス実装を新しいポインタで上書きするためのハックな方法はありますか?変更したいオブジェクトへのアドレスを取得したら、必要なものにキャストして上書きすることができます。私は基礎となる参照インスタンスのメモリアドレスを取得する方法を理解できませんでした。参照を逆参照するために&
を使用しても、参照のアドレスではなく、参照によって参照されるオブジェクトのアドレスが得られます。C++リファレンスをどのように変更できますか(任意の手段で)
これは明らかに未定義の動作を呼び出すことに気付きました。これは単なる実験に過ぎません。サードパーティのライブラリには、コードが実行される前に構築されていなかったグローバル参照のバグがあり、参照を自分で設定することで修正できるかどうかを確認したいと思います。この時点で、それが可能であるかどうかを確認することは難題になりました。シンボルテーブルを直接参照することができれば、アセンブリ言語でこれを行うことができます。
私はこれを想像します。これらはグローバルスコープの変数です。
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ですが、コンパイラはIntelですが、この実験ではgccを使用できます)。
あなたはうまくいきませんか?このコードを試してください: 'Apple a;アップル&a_ref;アップルb;あなたが 'a_ref'が' b'を指していることを確かめるでしょう。単にデータをコピーするだけではありません。もしあなたが 'a = b'をしたら、あなたはそうではないでしょう。 –
@QPaysTaxes、参照で代入演算子を使用すると、参照先オブジェクトが割り当てられます。 – chris
@QPaysTaxes:指定したコード例はコンパイルされません。 'Apple &a_ref;'は無効です。次のコード: 'Apple a;アップル&a_ref = a; a_ref = b; 'は、Apple Aとあらゆる点で同等です。 a = b; ' –