コンテキスト:私はポインターを頭にかぶろうとしています。数週間前に学校でそれらを見ただけで、今日練習しているときに、ばかげたことに遭遇しましたか?問題、それはあなたにとって非常に簡単ですが、プログラミングの経験はほとんどありません。
私は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.
}
だから私の質問は:
- 最初のケースが機能しないのはなぜですか?ポインターを使用および削除する最も簡単な使い方のようです?エラーは、メモリが割り当てられなかったが、「cout」がアドレスを返したことを示しています。
- 2番目の例では、エラーはトリガーされていませんが、myPointerの値をcoutしてもメモリアドレスが返されますか?
- #3は本当に機能しますか?私には機能しているようですが、ポインタはアドレスを格納していません。これはポインタを削除する適切な方法ですか?
長い質問で申し訳ありませんが、これをできるだけ明確にしたいと思います。繰り返しますが、プログラミングの経験はほとんどないので、誰かが素人の言葉を使ってこれに答えることができれば、大いに感謝します!
delete
あなただけnew
。また、ポインターを削除した後で、ポインター自体をNULLに設定する必要もありません。そこで安全を確保したい場合は、スマートポインタを使用してください。メモリを解放し、何かを保持していないときにアクセスしようとするとエラーが発生します。