-3

ポインタに0が割り当てられている場合、OS /デバッガは何をしますか?

4

8 に答える 8

3

これが解決する本質的な問題は、すべてのCPUが同じ種類のメモリ逆参照セマンティクスを実装しているわけではないということです。場合によっては、アドレスがfree()エラーのように見えるものになった後、そのアドレスを間接参照することができないことがあります。これは、組み込みプロセッサに特に当てはまります。その他の場合、パフォーマンス上の理由から、アロケータは解放されたメモリをホストオペレーティングシステムに戻すことに非常に怠惰になる可能性があります。

基本的に、このようなポインタを逆参照すると、実際に解放された領域が表示されたり、ゼロ化された領域が表示されたり、後続の割り当てによって返されたメモリが表示されたり、CPU例外が発生したりする可能性があります。このような不測の事態は完全に合理的であるため、c++はこの条件を「未定義動作」として割り当てています。

この状況から抜け出すには、解放または割り当てられたポインター値を区別する方法が必要です。そのため、C ++では、割り当てられたポインターの逆参照が0エラーである必要があり、そのようなポインターを整数に変換してもゼロが返されます。


re:現在の編集。

オペレーティングシステムの目的のためのポインタは存在しません。最下位レベルには、文字列、整数、浮動小数点数、またはいかなる種類のポインタもありません。バイトのみ。ポインタ値に0を割り当てるC++プログラムを作成する場合、オペレーティングシステムは単純に方程式を入力しません。それは完全にコンパイラの実装次第です。

一方、プログラムでそのようなポインタを逆参照する場合 c++ではこれが実行時エラーである必要があります。組み込みシステムでは、これは基本的に実用的ではありません。0は、そのようなシステムで完全に有効なメモリアドレスであり、通常、SRAMはそのアドレスの近くにあります。コンパイラが標準を厳密に実装している場合、間接参照の前にチェックを挿入してnullかどうかを確認し、MCUをエラー状態にする可能性がありますが、これは異常です。これは、すでに低速のシステムを遅くし、プログラムサイズを大きくするためです。

より完全な機能を備えたシステム、つまりメモリ管理ユニットを備えたシステムでは、アプリケーションのゼロアドレスは通常、物理ページにマップされないため、オペレーティングシステムは、ページプログラムでセグメンテーションフォールトを発生させようとするときに、ここで役立ちます。 nullポインタ値にアクセスします。

于 2012-06-06T02:00:55.547 に答える
2

0へのポインターはヌルポインターと呼ばれ、通常、何も指していないことを示すために使用されます。これは、デバッガー/ランタイム/コンパイラー/その他によってチェックして、無効なデータへのポインターがないことを確認できます。これは、ポインタが現在何かを指しているとは想定されていないことを明示的に認識しているだけです。

于 2012-06-06T01:51:52.073 に答える
2

ポインタに0(またはNULL、またはインポートに応じて事前定義されているもの)を割り当てることは、次のことを示すために使用される一般的な規則です。

  • ポインタは使用されていません(対象のメモリアドレスを指していない)、
  • また、逆参照しないでください
于 2012-06-06T01:52:52.510 に答える
2

OS/デバッガーよりもプログラマーの方が便利だと思います。

OS /デバッガーは、ポインターがどこを指しているかを気にしません。

ただし、ポインタが意味のある場所を指しているかどうかを確認すると便利です。

于 2012-06-06T01:54:01.563 に答える
1

簡単に言うと、この長い回答リストに追加するために、ランタイムは0、またはNULLポインターを割り当てます。もう一方の端のメモリは、動的に割り当てられた場合(および)、以前に解放された場合(free()または)、または(デフォルトではすべてのローカル)であるために自動的にクリーンアップされた場合を除きます。operator deletemalloc()operator newauto

NULLもう一方の端に有効なメモリがあるポインタに割り当てると、メモリリークが発生します。メモリリークとは、プロセスがまだメモリを使用しているとOSが判断したが、プロセスがメモリを処理できない(アドレスを失った)ため、メモリを解放したり使用したりする方法がない場合です。プロセスが終了するとメモリはクリーンアップされますが、実行時間の長いプロセス、複数回リークするプロセス、または最悪の場合、大量のメモリをリークするプログラムは大きな問題を引き起こす可能性があります。

プロセスが十分なメモリをリークした場合、少なくともシステムの動作が遅くなり、ユーザーに強制的に強制終了させます。最悪の場合、OOMキラー(システムが1つあるシステム)が呼び出され、さらに悪いことに、システム全体がクラッシュします。メモリ不足。また、NULLポインタを間接参照すると、最新のOSではセグメンテーション違反またはバスエラーが発生し、古いOSではシステム(DOSなど)が破壊される可能性があります。

デバッガーは、十分な情報がある場合に通知する場合があります。静的分析ツールを使用してメモリリークを検出したり、valgrindなどのランタイムツールを使用したりすることもできます。メモリリークはC/C ++プログラムの最大の問題の1つであり、コードを実現する前に注意深く探す必要があります。

于 2012-06-06T02:11:39.700 に答える
0

ポインタを0に設定しても、ダングリングポインタの問題は解決されません。ダングリングポインタ(定義上無効)が有効であるとコードが判断した場合でも、0に設定して間接参照すると、プログラムは不正な動作を示します。

コードが間接参照の前にポインタのnullをチェックする場合、ポインタを0に設定すると、不正な動作を回避できます。

于 2012-06-06T01:55:51.993 に答える
0

ヌルポインタは、単なる慣例よりも重要です。nullptrを解放して、何もしないようにすることができます。また、ポインタがまだ何も指していないという慣例としても使用されます。

于 2012-06-06T01:55:59.987 に答える
0
Why is assigning 0 to a pointer a solution to a dangling pointer?

@ウィキペディア::

To expose dangling pointer errors, one common programming technique is to set
pointers to the null pointer or to an invalid address once the storage they 
point to has been released. When the null pointer is dereferenced 
(in most languages) the program will immediately terminate—there is no potential
for data corruption or unpredictable behavior. This makes the underlying 
programming mistake easier to find and resolve.  
This technique does not help when there are multiple copies of the pointer.  

What does the OS/Debugger do when a pointer is assigned 0?

@ウィキペディア::

though, that the physical address zero is often directly accessible by hardware (for 
instance, it is directly accessible in x86 real mode, and it is where the interrupt  
table is stored), but modern operating systems usually map virtual address spaces in 
such a way that accessing address zero is forbidden.
于 2012-06-06T02:09:14.173 に答える