1. ホーム
  2. c++

[解決済み] セグメンテーションフォールトとは何ですか?

2022-03-24 13:50:22

質問

セグメンテーションフォールトとは何ですか?CとC++では違うのですか?セグメンテーションフォールトとダングリングポインターはどのように関係していますか?

解決方法は?

Segmentation faultは、"自分のものではない "メモリにアクセスすることで発生する、特定の種類のエラーです。これは、メモリを破損したり、デバッグが困難なメモリバグを発生させないようにするための補助的なメカニズムです。セグメンテーションフォールトが発生するときはいつも、すでに解放された変数へのアクセス、メモリの読み取り専用部分への書き込みなど、メモリに対して何か間違った操作をしていることがわかります。セグメンテーションフォールトは、メモリ管理をいじることができるほとんどの言語で本質的に同じであり、CとC++のセグメンテーションフォールトの間に主要な違いはないのです。

少なくともC(++)などの低レベルの言語では、セグメンテーションフォールトを起こす方法はたくさんあります。セグメンテーションフォールトを起こす一般的な方法は、ヌルポインタをデリファレンスすることです。

int *p = NULL;
*p = 1;

また、読み取り専用とされたメモリの一部に書き込もうとすると、別のセグメンテーションフォールトが発生します。

char *str = "Foo"; // Compiler marks the constant string as read-only
*str = 'b'; // Which means this is illegal and results in a segfault

ダングリングポインターは、このように、もう存在しないものを指しています。

char *p = NULL;
{
    char c;
    p = &c;
}
// Now p is dangling

ポインター p を指しているため、ダングリングしています。 c がブロックの終了後に存在しなくなった。そしてダングリングポインタをデリファレンスしようとすると ( *p='A' を使用すると、おそらくセグメンテーションフォールトが発生します。