2012-06-08 2 views
-4

C#에서 Knuth-Morris-Pratt 알고리즘을 구현하려고합니다.C 코드를 안전하지 않은 C#으로 이식 할 때 NullReference?

정규 표현식에 대해 말하지 않고 C#에서 메모리 작업을하지 마십시오. 이 항목의 목적은 C# 기능이 실제로 유용하지는 않지만 C#에서 포인터를 사용하는 작업과 정확하게 이러한 기능을 배우는 메모리 작업에 관한 내용이기 때문입니다.

는 C# http://ideone.com/Ck0G0

순수 C http://ideone.com/FVAzU

가 나는 순수한 C의 버전에 문제가 없다, 그것은 문제없이 잘 작동하면 C# 및 순수 C. 모두 구현을 보여 드리죠 ,하지만 C# 버전이 아닙니다.

I는이 라인 C에서 문제가있다 : I가 NullReferenceException이 포획있어

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

0 값으로 설정하여 처리를하고 * D [0]. 내가이 참조를 읽고

:

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

null 객체 참조 역 참조에 대한 시도가있을 때 throw되는 예외입니다.

나는 왜이 물건이 내 C# 코드에서 null인지 전혀 이해하지 못합니까?

나는 int [] 배열에 * d 포인터를 정의하고 이것을 새로운 [] 연산자로 메모리에 할당 했으므로 메모리가 이미 할당 된 경우 null 참조를 역 참조합니다. ?

또한 C#에서 명시 적으로 포인터를 삭제하는 방법에 대한 질문이 있습니다.

나는이 키워드를 사용하지 않고이 원한다면 그것이 을 고정 함께 할 수 있다는 것을 알고 있지만?

내가 기억하기로는 Dispose() 메서드를 호출해야하지만 (이 메서드를 찾지 못했지만 * d) null로 설정하고 GC.Collect()를 호출해야합니다. 이 방법이 올바른 방법입니까?

감사합니다,

베스트 감사합니다!

+0

이 연습의 요점은 무엇입니까? –

+2

모든 지긋 지긋한 대화방에서 스팸 메일을 보내지 마십시오. 스팸으로 간주되며 사람들이 여러분을 도우 려하지 않을 것입니다. – Sir

+0

@ C#에서 메모리가있는 bryan-crosby 수동 작업 (원하는 경우 함수에서 객체를 삭제하고 싶지만 GC가 수행 할 때 객체를 삭제하지 않음), 포인터로 작업하고 C에서 입력하십시오. – Secret

답변

6

int *d = (int*)malloc(M * sizeof(int));Mint 값에 메모리를 할당합니다. d은 할당 된 메모리를 가리 킵니다. 그래서 포인터의 배열이 아니라 배열에 대한 포인터입니다. 다음

C#으로

하면 Mint 값들의 배열을 생성하여 변수의 배열에 대한 참조를 저장할 수

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

를 어레이 관리 개체이고; 수동으로 해제하거나 삭제하거나 가비지 수집기를 호출 할 필요가 없습니다.

코드에 나타나는 NullReferenceException은 d[0]에있는 포인터를 역 참조하려고 시도한 것이므로 배열 생성 식에서 null으로 초기화됩니다.

+0

더 int int [] d = 새로운 int [M * ​​sizeof (int)], 아니요? 하지만 C와 같은 포인터를 통해 C#에서 메모리를 할당하려는 경우 동일한 작업을 수행 할 수있는 방법이 있습니까? C에 관해서는 M * sizeof (int)의 크기로 메모리를 할당하고, int *로 캐스팅 한 다음 할당 된 모든 memeory를 사용하기 위해 int * d 포인터로 설정한다는 것을 알고 있습니다. – Secret

+0

Object.Array는 물론 관리되지만 관리되지 않는 항목의 다른 레이어뿐만 아니라 제어 될 수있는 C#으로 관리되는 항목은 무엇입니까? – Secret

+2

아니요. 저는'int [] d = new int [M];이라고 썼습니다. 나는 그것을 의미했습니다. – dtb

관련 문제