C# のメモリ不足例外
C# の OutOfMemoryException は、プログラムの実行を継続するのに十分なメモリがない場合に、.NET Framework 実行エンジンによってスローされる例外です。その名前が示すように、この例外は、CLR、つまり共通言語ランタイムがプログラムの特定の操作を実行するために必要な十分なメモリを割り当てることができない場合に、プログラム内で発生します。
この例外は、メモリ内に十分な空き領域がないことを常に意味するわけではありませんが、場合によっては、プログラムで割り当てに必要な連続メモリが不足していることを意味します。
構文
C# で OutOfMemoryException をキャッチする構文は次のとおりです。
try { //user code which can throw OutOfMemoryException } catch(OutOfMemoryException <em>exception</em>) { //statements to handle the exception }
C# で OutOfMemoryException をスローする構文は次のとおりです。
throw new OutOfMemoryException();
上記のステートメントの「throw」は、C# で例外をスローするために使用されるキーワードです。
C# で OutOfMemoryException はどのように動作しますか?
C# では、プログラムの実行を継続するための十分な領域がプログラムにない場合、OutOfMemoryException が発生します。この例外が発生する理由は数多く考えられます。この例外は、全体としてプログラムを実行するのに十分な領域があるにもかかわらず、この領域がプログラムで必要な割り当てに連続していない場合にも発生します。この例外の主な理由は次の 2 つです:
StringBuilder オブジェクトの長さを、StringBuilder の MaxCapacity プロパティで指定された長さを超えて増やそうとしています。
「プログラムの実行を続行するにはメモリが不足しています」という例外が発生します。
- メモリ割り当てを必要とする割り当てを行っているとき、またはメモリ割り当てを必要とするメソッドを呼び出しているときに、CLR が割り当てに十分な連続メモリを提供できない場合、OutOfMemoryException が発生します。
この例外の原因となる可能性のあるその他の理由は次のとおりです。
- 仮想メモリが 2 GB しかない 32 ビット システムでアプリケーションを実行すると、CLR はアプリケーションに必要な割り当てに連続したメモリを提供することが困難になるためです。
- ファイル ハンドラー、データベース接続、ポインターなどのアンマネージ リソースを操作した後、これらのリソースを破棄しないとメモリ リークが発生し、結果としてアプリケーションのパフォーマンスが低下し、OutOfMemoryException が発生する可能性があります。
- 大規模なデータ セットの操作には大量のメモリが必要です。CLR に使用可能な十分な連続スペースがない場合、OutOfMemoryException が発生します。
- 文字列は不変であるため、文字列に対して実行される操作によりメモリ内に新しい文字列が作成されます。そのため、大きな文字列を操作し、その文字列に対して連結操作を繰り返し実行すると、複数のメモリ割り当てが発生し、結果としてアプリケーションのパフォーマンスが低下し、OutOfMemoryException の原因となる可能性があります。
- 非常に長期間にわたって複数のオブジェクトをメモリ内に固定した場合、ガベージ コレクターがこれらのオブジェクトに連続したメモリ割り当てを提供することが困難になります。
例
以下に挙げる例は次のとおりです
例 #1
StringBuilder オブジェクトを最大容量を超えて拡張しようとしたときにプログラムによってスローされる OutOfMemoryException を示す例。
コード:
using System; using System.Text; public class Program { public static void Main() { StringBuilder stringBuilder = new StringBuilder(17, 17); stringBuilder.Append("Welcome to the "); try { stringBuilder.Insert(0, "world of C# programming", 1); Console.WriteLine(stringBuilder.ToString()); Console.ReadLine(); } catch (OutOfMemoryException exception) { Console.WriteLine(exception.Message); Console.ReadLine(); } } }
出力:
例 #2
追加する要素の数がリストの容量を超える場合に、リストに要素を追加しようとしたときに OutOfMemoryException が発生するプログラムを示す例です。
コード:
using System; using System.Text; using System.Collections.Generic; namespace ConsoleApp4 { public class Program { public static void Main() { try { string[] strArray = GetArray(); Console.WriteLine(strArray); Console.ReadLine(); } catch (OutOfMemoryException exception) { Console.WriteLine(exception); Console.ReadLine(); } catch (Exception ex) { Console.WriteLine(ex.Message); Console.ReadLine(); } } public static string[] GetArray() { List<string> strList = new List<string>(); for (int i = 0; i <= int.MaxValue; i++) { strList.Add("Hello"); } return strList.ToArray(); } } }
出力:
C# で OutOfMemoryException を回避するには?
次の点に留意することで、C# で OutOfMemoryException を回避できます。
- StringBuilder の操作中にこの例外を回避するには、コンストラクター StringBuilder.StringBuilder(Int32, Int32) を呼び出し、対応する StringBuilder を展開するときに必要な調整を提供するのに十分な大きさの値に MaxCapacity プロパティを設定します。オブジェクト。
- 32 ビット システムで作業しているときにこの例外を回避するには、以下の手順で Visual Studio でアプリケーションを 32 ビット システムから 64 ビット システムに再コンパイルします。
- メニューバー ->ビルド ->構成マネージャー
- アクティブ ソリューション プラットフォームのリストをクリックし、64 ビット プラットフォームを選択して、[閉じる] ボタンをクリックします。
64 ビット プラットフォームがリストにない場合:
- リストから「新規」オプションをクリックします
- [新しいソリューション プラットフォーム] ウィンドウで、[新しいプラットフォームを入力または選択] リストをクリックし、[x64] オプションを選択します。
- 「OK」ボタンをクリックします。
- アンマネージド リソースの操作中にこの例外が発生しないようにするには、不要になったアンマネージド リソースでの作業が完了した後、常に Dispose() メソッドを呼び出す必要があります。
- 大規模なデータセットを扱うときにこの例外を回避するには、データをフィルタリングしてから、処理に必要なデータのみを渡す必要があります。
- 大きな文字列を扱うとき、または大きな文字列の連結を実行するときにこの例外を回避するには、文字列の代わりに StringBuilder を使用します。これは、StringBuilder は変更可能であり、文字列に対して操作を実行するときに文字列の新しいインスタンスを作成しないためです。
結論
OutOfMemoryException は、十分なメモリがないか、C# プログラムに必要な割り当てに必要な連続メモリが不足していることをプログラマに伝えるランタイム例外です。
この例外を回避するには、ユーザーは常に必要な予防措置を講じ、この例外を処理する必要があります。
以上がC# のメモリ不足例外の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック











C# を使用した Active Directory のガイド。ここでは、Active Directory の概要と、C# での動作方法について、構文と例とともに説明します。

C# データ グリッド ビューのガイド。ここでは、SQL データベースまたは Excel ファイルからデータ グリッド ビューをロードおよびエクスポートする方法の例について説明します。

マルチスレッドと非同期の違いは、マルチスレッドが複数のスレッドを同時に実行し、現在のスレッドをブロックせずに非同期に操作を実行することです。マルチスレッドは計算集約型タスクに使用されますが、非同期はユーザーインタラクションに使用されます。マルチスレッドの利点は、コンピューティングのパフォーマンスを改善することですが、非同期の利点はUIスレッドをブロックしないことです。マルチスレッドまたは非同期を選択することは、タスクの性質に依存します。計算集約型タスクマルチスレッド、外部リソースと相互作用し、UIの応答性を非同期に使用する必要があるタスクを使用します。

XML形式を変更する方法はいくつかあります。Atepadなどのテキストエディターを使用して手動で編集する。 XmlBeautifierなどのオンラインまたはデスクトップXMLフォーマットツールを使用して自動的にフォーマットします。 XSLTなどのXML変換ツールを使用して変換ルールを定義します。または、Pythonなどのプログラミング言語を使用して解析および操作します。元のファイルを変更してバックアップするときは注意してください。
