1. ホーム
  2. c++

[解決済み] C++でポインタを削除する

2022-03-07 20:12:47

質問

コンテキスト ポインターについて理解しようとしているのですが、数週間前に学校でポインターを見たばかりで、今日練習しているときに、ばかげた問題にぶつかりました。

私はSOでポインタの削除に関する多くの質問を見ましたが、それらはすべてクラスの削除に関連しているようで、「単純な」ポインタ(または適切な用語が何であれ)ではないようです。

#include <iostream>;

using namespace std;

int main() {
  int myVar,
      *myPointer;

  myVar = 8;
  myPointer = &myVar;

  cout << "delete-ing pointers " << endl;
  cout << "Memory address: " << myPointer << endl;

  // Seems I can't *just* delete it, as it triggers an error 
  delete myPointer;
  cout << "myPointer: " << myPointer << endl;
  // Error: a.out(14399) malloc: *** error for object 0x7fff61e537f4:
  // pointer being freed was not allocated
  // *** set a breakpoint in malloc_error_break to debug
  // Abort trap: 6

  // Using the new keyword befor deleting it works, but
  // does it really frees up the space? 
  myPointer = new int;
  delete myPointer;
  cout << "myPointer: " << myPointer << endl;
  // myPointer continues to store a memory address.

  // Using NULL before deleting it, seems to work. 
  myPointer = NULL;
  delete myPointer;
  cout << "myPointer: " << myPointer << endl;
  // myPointer returns 0.

}

そこで質問なのですが。

  1. なぜ最初のケースはうまくいかないのでしょうか?ポインターを使用し、削除するのが最も簡単な使用方法のように思えますが?エラーは、メモリが割り当てられなかったが、'cout'がアドレスを返したと言っています。
  2. 2番目の例では、エラーは発生しませんが、myPointerの値をcoutしています。 今も はメモリアドレスを返すのですか?
  3. 3は本当に機能するのでしょうか?ポインターはもはやアドレスを保存していないのですが、これはポインターを削除する適切な方法ですか?

また、私はプログラミングの経験がほとんどないので、どなたか素人用語でお答えいただけると大変助かります!長い質問ですみません。

どのように解決するのですか?

1 & 2

myVar = 8; //not dynamically allocated. Can't call delete on it.
myPointer = new int; //dynamically allocated, can call delete on it.

最初の変数はスタック上に確保されました。動的に(ヒープ上に)確保したメモリに対してのみ、削除を呼び出すことができます。 new 演算子を使用します。

3.

  myPointer = NULL;
  delete myPointer;

上記で行った まったくない . ポインタがNULLを指しているので、何も解放していない。


以下はやってはいけないことです。

myPointer = new int;
myPointer = NULL; //leaked memory, no pointer to above int
delete myPointer; //no point at all

NULLを指したため、リークしたメモリ(新たに割り当てたint)が残っています。 あなたが指したメモリは解放する必要があります。割り当てられたメモリにアクセスする方法はありません。 new int そのため、メモリリークが発生しています。


正しい方法です。

myPointer = new int;
delete myPointer; //freed memory
myPointer = NULL; //pointed dangling ptr to NULL


より良い方法

C++を使うなら。 しない は生のポインタを使用します。使用方法 スマートポインタ これは、わずかなオーバーヘッドでこれらのことを処理することができます。C++11には いくつかの .