8

2 つのポインタが同じアドレスを指しているとどうなりますか? これはセキュリティ上の問題を引き起こしますか?

4

5 に答える 5

13

delete事実自体は問題ありませんが、ポインターの 1 つを呼び出して、後で他のポインターを使用しようとすると、未定義の動作に遭遇します。

int* x = new int(5);
int* y = x;
delete x;
//y is a dangling pointer

同じメモリ アドレスへの複数のポインターを使用する必要がある状況に遭遇した場合は、スマート ポインターを調べる必要があります。

于 2012-04-29T08:08:07.817 に答える
3

同じアドレスへのポインタを複数持つことは安全ですが、使用してメモリが削除されたdelete場合、または元の変数がスコープ外になった場合、それ以降のアクセスは未定義になることを確認してください。

于 2012-04-29T08:13:58.140 に答える
3

依存:

クラシック (非スマート) ポインターの場合: 複数のポインターで同じメモリ位置を指すことができますが、その位置を操作するとすべてのポインターにパーコレートされます。1 つのポインターのストレージを削除/解放すると、他のポインターが使用されているときに未定義の動作が発生します。ベスト プラクティスは、記憶域が解放されたらポインターを NULL にして二重削除を防ぐことであり、複数のポインターを使用する場合、これは実用的に妥当ではありません。

スマートポインター

Auto_Pointers(C++98) : C++ テンプレート クラスの実装は、1 つのメモリ位置を指す唯一のポインタを許可するメカニズムを提供しました。通常、これらのポインターはオブジェクトとしてスタックに実装されているため、スコープ外になると、アドレスは自動的に解放されます。しかし、あるポインターを別のポインターにコピー代入すると、もう一方が使用できなくなります。

Shared_Pointers(C++2003 TR1) : Boost ライブラリが提供する共有ポインタには、オブジェクトをいつ解放できるかを決定する参照カウントがあります。同じメモリ位置を共有する複数の使用可能なポインターを持つことができるため、これは auto_ptrs よりも優れています。

Unique_Pointers(C++11) : Auto_pointers に似ていますが、割り当てとコピー コンストラクターが公開されていない所有権の譲渡の概念を継承します。代わりに、意図が何であるかをより明確にするために move メソッドが実装されています。

于 2012-04-29T08:18:07.853 に答える
3

両方のポインターが同じ型の場合、問題はありません。

int a = 42;
int *p = &a
int *q = p;
*p = 3145;   // no problem, a and *q are now also equal 3145

両方のポインターが (例外を除いてchar *) 異なる型であり、同じオブジェクトを指している場合、ポインターの 1 つを逆参照することは未定義の動作です。

float a = 42.0f;
float *p = &a;
int *q = (int *) p;  // we assume pointer is correctly aligned
*q = 0;              // undefined behavior, it breaks aliasing rules

これらの規則は、C ポインターのエイリアシング規則として知られています。C エイリアシング規則のリストは、n1570.pdfの段落 6.5p7 にあります。

于 2012-04-29T10:22:33.580 に答える
0

両方のオブジェクトが同じヒープ アドレスを指しています。

メモリの割り当てを解除すると、同じアドレスを指す他のオブジェクトに問題が発生する可能性があります。

于 2012-04-29T08:17:07.167 に答える