[解決済み] 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.
}
そこで質問なのですが。
- なぜ最初のケースはうまくいかないのでしょうか?ポインターを使用し、削除するのが最も簡単な使用方法のように思えますが?エラーは、メモリが割り当てられなかったが、'cout'がアドレスを返したと言っています。
- 2番目の例では、エラーは発生しませんが、myPointerの値をcoutしています。 今も はメモリアドレスを返すのですか?
- 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には いくつかの .
関連
-
[解決済み】コンストラクターでのエラー:識別子を期待されますか?
-
[解決済み】C++エラー:の初期化に一致するコンストラクタがありません。
-
[解決済み】cc1plus:エラー:g++で認識されないコマンドラインオプション"-std=c++11"
-
[解決済み】エラー:strcpyがこのスコープで宣言されていない
-
[解決済み] 数値定数の前にunqualified-idを付けて、数値を定義することを期待する。
-
[解決済み] 型付けされた関数ポインタ?
-
[解決済み] スマートポインターとは何ですか?
-
[解決済み] なぜ、オブジェクトそのものではなく、ポインタを使用しなければならないのですか?
-
[解決済み] ポインタの「デリファレンス」とはどういう意味ですか?
-
[解決済み】JavaScriptで配列の要素を削除する - delete vs splice
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】C++でint型に無限大を設定する
-
[解決済み】C++ 非推奨の文字列定数から「char*」への変換について
-
[解決済み】 != と =! の違いと例(C++の場合)
-
[解決済み] クラスにデフォルトコンストラクタが存在しない。
-
[解決済み】fpermissiveフラグは何をするのですか?
-
[解決済み] [Solved] インクルードファイルが開けません。'stdio.h' - Visual Studio Community 2017 - C++ Error
-
[解決済み】システムが指定されたファイルを見つけられませんでした。
-
[解決済み] gdbを使用してもデバッグシンボルが見つからない
-
[解決済み】エラー。引数リストに一致するコンストラクタのインスタンスがない
-
[解決済み] スマートポインターとは何ですか?