C ランタイム エラーを解決する方法:「ポインタは割り当て解除されたメモリを指しています」
はじめに
C は強力なプログラミング言語ですが、使用するときは実行するときに、実行時エラーが発生することがよくあります。そのうちの 1 つは、「ポインタが割り当て解除されたメモリを指している」です。このエラーにより、プログラムがクラッシュしたり、予期しない結果が生じたりすることがよくあります。この間違いを避けるために、この記事ではいくつかの一般的な回避策を紹介し、対応するコード例を示します。
1. 問題の原因を理解する
問題を解決する前に、まずこのエラーの原因を理解する必要があります。ポインタが指すメモリを解放しても、ポインタは元のアドレスを保持したままになります。これは、メモリが解放されても、ポインタは依然としてそのメモリ アドレスを指していることを意味します。このポインターを使用しようとすると、「ポインターは割り当て解除されたメモリを指しています」エラーが発生します。
2. スマート ポインターを使用する
スマート ポインターは C の重要な機能であり、メモリを管理し、よくある間違いを回避するのに役立ちます。スマート ポインターを使用すると、「ポインターが割り当て解除されたメモリを指している」問題を効果的に解決できます。以下はサンプル コードです。
#include <memory> int main() { std::shared_ptr<int> ptr = std::make_shared<int>(10); ptr.reset(); // 释放指针所指向的内存 // 使用智能指针时,它会自动判断指针是否有效 if (ptr) { // 这里的代码不会执行,因为指针已经被释放 *ptr = 20; } return 0; }
このサンプル コードでは、std::shared_ptr
を使用して動的メモリを割り当て、使用後に reset
を渡します。メモリを解放します。スマート ポインターを使用すると、ポインターはメモリが解放されたかどうかを自動的に判断するため、誤った使用を回避できます。
3. null ポインター アクセスを回避する
「ポインターが割り当て解除されたメモリを指している」問題を解決するもう 1 つの方法は、null ポインター アクセスを回避することです。以下にサンプル コードを示します。
int main() { int* ptr = new int(10); delete ptr; // 释放指针所指向的内存 // 检查指针是否为空 if (ptr != nullptr) { // 这里的代码不会执行,因为指针已经被释放 *ptr = 20; } return 0; }
このサンプル コードでは、if
ステートメントを使用して、ポインタが指すメモリを解放した後、ポインタが null かどうかを確認します。このようにして、null ポインターへのアクセスを回避し、エラーを回避できます。
4. ポインターを正しく解放する
C では、通常、動的に割り当てられたメモリを解放するために delete
または delete[]
を使用します。ポインタを解放するのを忘れると、「ポインタは割り当て解除されたメモリを指しています」というエラーが発生する可能性があります。サンプル コードは次のとおりです。
int main() { int* ptr = new int(10); // 忘记释放指针 // 这里的代码会出现错误,因为指针未释放 *ptr = 20; return 0; }
このサンプル コードでは、動的メモリを割り当て、プログラムの終了前にそれを解放するのを忘れています。その結果、プログラム内でポインターを使用するとエラーが発生します。これを回避するには、delete
または delete[]
を使用してポインタを解放することを常に忘れないようにする必要があります。
結論
「ポインタは割り当て解除されたメモリを指しています」エラーは、C でよく見られるランタイム エラーの 1 つです。この問題を解決するには、スマート ポインタを使用してメモリを管理し、null ポインタ アクセスを回避し、ポインタを常に正しく解放します。これらの方法に従い、コードを注意深くチェックすることで、このエラーの発生を効果的に回避できます。
この記事で紹介した方法とサンプル コードが、「ポインターが割り当て解除されたメモリを指しています」エラーをより適切に解決し、より安定した信頼性の高い C プログラムを作成するのに役立つことを願っています。
以上がC++ ランタイム エラー:「ポインタは割り当て解除されたメモリを指しています」を解決するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。