オブジェクトを一意に識別するために、オブジェクトへの実際のポインター アドレス (揮発性とマークされていない) を使用したいと考えています。
これは悪いことですか?一般に、システムメモリ管理はオブジェクトを移動するので、そのアドレスは安定していますか?
ありがとう
オブジェクトを一意に識別するために、オブジェクトへの実際のポインター アドレス (揮発性とマークされていない) を使用したいと考えています。
これは悪いことですか?一般に、システムメモリ管理はオブジェクトを移動するので、そのアドレスは安定していますか?
ありがとう
ポインターは、何かを壊さない限り、それが指しているオブジェクトの存続期間中、安定したままであることが保証されています。OS は確かにメモリ内で物事を移動しますが、それは物理メモリです。OS がプロセスに提示する仮想メモリ空間は、物事を同じアドレスに保持します。
C では、オブジェクトのアドレスはその存続期間中一定です。realloc
C 標準では、オブジェクトを「移動」しないことに注意してください。同じ内容 (古い長さと新しい長さの短い方) を持つ新しいオブジェクトを割り当て、成功した場合は古いオブジェクトを解放します。
ポインターは安定していますが、ポインターを正しく使用する必要があります。そうしないと、コードが不安定になります。
ポインタは、オブジェクトが死ぬ瞬間まで有効です。オブジェクトが死ぬと、ダングリング ポインタと呼ばれるものができます。
ダングリング ポインターを回避する方法は多数ありますが、そのうちのいくつかは非常に高度なトピックです。たとえば、「ハンドル」を使用することもできますが、それはより洗練されたアプローチであり、デフォルトとは異なるメモリ管理が必要になります。
使用している言語も、ポインターを無効にする方法に影響します。C、C++、および Objective-C としてタグ付けされた質問があります。C では、malloc と realloc によってポインターを無効にすることができます。C++ では、ポインターを削除によって無効にすることができます。
この記事など、初めて紹介される場合は、ポインタについてもっと読むことを強くお勧めします。
また、 std::shared_ptrをさらに読むことをお勧めします。
オブジェクトへのポインターは、オブジェクトが死ぬまで有効です (安定)。
識別にポインターを使用することには用途がありますが、最善の方法ではない場合があります。
iOS メモリ管理は、オブジェクトを移動しません。オブジェクトへのポインターがある場合、それはオブジェクトの存続期間中有効です。
あなたの質問では、「ポインターアドレス」を参照しています。ただし、オブジェクトへのポインターを意味していると思います。そうしないと、この質問に対する答えがより複雑になります。