한 줄을 주석으로 처리하여 아래에 코드 블록이 있습니다. CreateArray
메서드에서 일어나는 일은 주석 처리 된 행과 동일한 작업입니다. 제 질문은 라인 b->ArrayItems = d
의 주석 처리가 해제되었지만 주석 처리 될 때 가비지를 반환 할 때 작동하는 이유는 무엇입니까? 모든 정보가 관리되지 않기 때문에 나는 "고정"해야한다고 생각하지 않습니다. 이 가정은 틀린가?안전하지 않은 코드 및 스택 alloc을 사용할지 여부에 대한 혼란
class Program
{
unsafe static void Main(string[] args)
{
someInstance* b = stackalloc someInstance[1];
someInstance* d = stackalloc someInstance[8];
b->CreateArray();
// b->ArrayItems = d;
*(b->ArrayItems)++ = new someInstance() { IntConstant = 5 };
*(b->ArrayItems)++ = new someInstance() { IntConstant = 6 };
Console.WriteLine((b)->ArrayItems->IntConstant);
Console.WriteLine(((b)->ArrayItems - 1)->IntConstant);
Console.WriteLine(((b)->ArrayItems - 2)->IntConstant);
Console.Read();
}
}
public unsafe struct someInstance
{
public someInstance* ArrayItems;
public int IntConstant;
public void CreateArray()
{
someInstance* d = stackalloc someInstance[8];
ArrayItems = d;
}
}
그건 함정입니다. 놀기 시작하고 실수를하지 않으면, 관리 메모리 모델의 모든 것을 이해하는 법을 배우지 못할 것입니다.하지만 안전하지 못한 게임을하기 전에 모든 것을 먼저 이해해야 만한다면 ... – Abel
" 틀림없이 조금 강한가? 스택이 할당 된 블록보다 스토리지가 더 이상 지속되지 않는 한 확실히 저장할 수 있습니다. –
@Marc : 물론, 나는 당신의 요점을 알고 있습니다. "저장"이란 말은 현재 범위를 벗어나는 * 지속적인 * 것을 의미합니다. –