C#

2014-04-16 1 views
2

의 안전하지 않은 코드 동작을 모호하게 함 최근에 일부 트리를 작성하여 안전하지 않은 코드를 사용하려고합니다. 마지막으로 나는 안전하지 않고 모든 할 수 있지만,이 코드의 일부 모호한 (나를 위해) 장소 찾기 (나는 모든 논리를 삭제 짧은 코드를 그래서 모든 코드는 매우 의미가 보이는) :C#

public static void Main() { 
     EqClass a = new EqClass(); 
     a.AddElement(2, new record(3)); // *place1* 
        ... 
      } 
    unsafe struct node { 
     public node* next; 
     public record Value; 
     public node(record value) { 
      this = new node(); 
      this.Value = value; 
     } 
    } 
    struct record { 
     public int a; 
     public record(int a) { 
      this.a = a; 
     } 
    } 
    unsafe class EqClass { 
     node*[] last = new node*[3]; 
     public void AddElement(int classIndex, record element) { 
      node a = new node(element); 
      node* newNode = &a; 
      last[classIndex]->next = newNode; // *place2* 
     } 
    } 

place2 모두에서하는 모든 권리이지만, 메소드 AddElement이 끝나면 last [2] (우리가 요소를 넣는 곳)에 예기치 않게 쓰레기가 나옵니다. 하지만 왜? 미리 감사드립니다.

+1

왜 관리 코드 대신 안전하지 않은 코드를 사용하려고합니까? – Servy

+0

Psst : 클래스를 사용하십시오. – Ryan

+0

예, 클래스 및 관리 코드를 사용하여 마침내 수행했지만이 코드가 작동하지 않는 이유는 매우 흥미 롭습니다. 나는 실수를 발견하지 못했습니다 ... –

답변

6

이것은 이 아닙니다.은 무엇입니까 unsafe*입니다. 진지하게 : 이것을하지 마십시오. 여기에서하는 일은 본질적으로 참고 사항입니다. 이를 위해서는 이 아니라 class을 사용하십시오. 이것은 다르게 아주 심하게 다치게 할 것입니다.

기타 : struct이 대상이 아닙니다. 이와 같이 변경 가능한 struct을 보면 잠시 후 struct의 의도를 이해하지 못한다고 알려줍니다.

말도 안되는 값의 출처를 알고 싶다면 포인터는 고정 된 위치가 아닙니다. 이것에 대한 수정은 "오, 그래서 나는 그들을 고정시킬 필요가 없습니다". 그것은 "포인터가 아닌 참조 사용"입니다.

+1

이것은 대답이 아닌 주석이어야합니다. – Servy

+1

@Servy 아니, 죄송합니다.하지만 그렇게해서는 안됩니다. 이 경우의 대답은 단순히 "당신이 근본적으로 잘못하고있다"입니다. –

+0

그리고 그것은 아직 느려질 것입니다, 그렇습니까? 이해합니다.하지만 안전하지 않은 코드를 사용해 보는 것은 흥미 롭습니다. 그리고 저에게 이상하게 작동한다는 것을 알았을 때, 저는 관심이있었습니다, 왜? –