-4

純粋なCでの実装と同様に、C#でKnuth-Morris-Prattアルゴリズムを実装しようとしています。

正規表現とC#のメモリでの作業から解放されていることについて教えてください。なぜなら、このトピックの目的は、C#機能の真の有用性ではなく、C#で正確にポインターを使用する作業と、そのような機能を正確に学習するメモリ作業についてです。

C#と純粋なCの両方での実装を紹介します。

C#http://ideone.com/Ck0G0

ピュアChttp://ideone.com/FVAzU

Pure Cのバージョンには問題はありません。問題なく動作しますが、C#バージョンでは動作しません。

この行のC#に問題があります:

    int*[] d = new int*[M * sizeof(int)];
    *d[0] = 0;

NullReferenceExceptionが0の値を*d[0]に設定して処理されたことがわかりました。

私はこのリファレンスを読みました:

http://msdn.microsoft.com/en-en/library/system.nullreferenceexception.aspx

nullオブジェクト参照を逆参照しようとしたときにスローされる例外。

私のC#コードでこのようなものがnullである理由がまったくわかりませんか?

int[]配列への*dポインターを定義し、new []演算子を使用してこれにメモリを割り当てましたが、メモリがすでに割り当てられている場合、nullオブジェクト参照を逆参照していると表示されるのはなぜですか?

また、C#でポインターを明示的に削除することについての質問があります。

固定で実行できることは知っていますが、このキーワードを使用せずにこれが必要な場合はどうでしょうか。

私が覚えているように、これにはDispose()メソッドを呼び出す必要があります(ただし、* dの場合、このメソッドは見つかりませんでした)。nullに設定してGC.Collect()を呼び出します。この方法は正しい方法ですか?

ありがとう、

よろしくお願いします!

4

1 に答える 1

6

int *d = (int*)malloc(M * sizeof(int));値にメモリを割り当てM intます。d割り当てられたメモリを指します。つまり、これはポインタの配列ではなく、配列へのポインタです。

C#では、次のようにM int値の配列を作成し、その配列への参照を変数に格納できます。

int[] d = new int[M];
d[0] = 0;

アレイは管理対象オブジェクトです。手動で解放したり、破棄したり、ガベージコレクターを呼び出したりする必要はありません。

コードに表示されるNullReferenceExceptionは、配列作成式によってd[0]初期化されたのポインタを逆参照しようとしたことが原因です。null

于 2012-06-08T04:04:06.883 に答える