2012-02-10 11 views
2

C++コードを実行しているときにsegfaultsが発生しました。私はポインタを削除するプログラム内の行に問題を切り分けました。ここでは、同じエラーが発生し、簡単な例です:Segfaultがポインタを削除するとき

int main() 
{ 
    int* pointer=0; 
    int number = 3; 

    pointer = &number; 
    delete pointer;//This line causes a segmentation fault 
    pointer=0; 

    return 0; 
} 

若干の修正が期待どおりに動作するコードを生成します。最初は、セグメンテーションフォルトが発生し、第二にはない理由

int main() 
{ 
    int* pointer=new int(3); 

    delete pointer;//This line now works 
    pointer=0; 

    return 0; 
} 

誰かが説明できますか?私はポインタが数値変数のアドレスに割り当てられているので、ポインタが無効ではないことを知っています。

+4

最初に 'new'が割り当てられていないので、' delete'を呼び出すことは決して正しいことではありません。 – ildjarn

答えて

14

newで割り当てられたメモリはdeleteにする必要があります。スタック上で宣言された自動変数はdeleteである必要はありません。原則として、常にあなたのメモリの割り当てと解放型と一致:newに割り当てられた

  • メモリがdeleteで割り当てを解除する必要があります。
  • new []で割り当てられたメモリは、delete []で割り当て解除する必要があります。
  • malloc()で割り当てられたメモリは、free()で割り当て解除する必要があります。 deleteオペレータがヒープに戻って、そのメモリを置くしようとしますので、

セグメンテーション違反があり、それは発信しませんでしたスタック上の自動メモリに対して真保有していないメモリの特定の性質に依存していますヒープから。

3

newで取得できなかったものにはdeleteを使用することはできません。これを行おうとすると、未定義の動作が発生します。プログラムがクラッシュしましたが、何かが起きた可能性があります。

0

deletenewで割り当てられていないポインタを使用すると、メモリ管理システムとスタックの間に競合が発生します。それぞれはメモリの唯一の所有権を持っているかのように動作し、互いの値を上書きするとクラッシュする可能性があります。

0

新しいとvariabile割り当てるとき:この変数は、すべてのメモリが割り当てられdnamicly含まれているヒープ、に置かれている

int *a=new int(4); 

を。 代わり場合は、変数を宣言:

int a=4; 

スタティックメモリがスタックに割り当てられます。 動的メモリはユーザからの削除で割り当てを解除できますが、スタティックメモリでは削除できません。 スタティックメモリはautomaticllyにするときyuo終了froma機能割り当てが解除されます。関数が終了すると

void function() 
{ 
    int a; 
} 

自動的に(「静的」キーワードで宣言された変数を除く)割り当てが解除されます。 main関数の変数も自動的に割り当てが解除されます。 スタック内の変数の割り当てを解除するプログラムに言うことはできません。 スタック内の変数を削除しようとすると、スタック内にある数値がスタック上にあることを示します。動的メモリではないため、ポインタは許可されません。

2

ポインタの削除を呼び出すと、ポインタが指す動的に割り当てられたメモリの割り当てが解除されます。

最初のプログラムでは、ポインタは静的に割り当てられたメモリ位置を指します。変数番号は '自動'変数です。つまり、メモリが自動的に管理されます。

一方、第2のプログラムでは、ポインタがヒープセグメントに割り当てられたメモリ位置を指しています。これはdeleteを呼び出すことによって手動で割り当てを解除する必要があります。

このlinkが役に立ちます。

関連する問題