나는 안전하지 않은 코드를 사용하여 WPF의 WriteableBitmap
을 받아 BackBuffer
에서 직접 읽는 방법을 사용합니다. 한편으로여기서 GC.KeepAlive가 필요합니까? 아니면 객체를 유지하면서 지역 및 인수에 의존 할 수 있습니까?
int MyMethod(WriteableBitmap bmp)
{
return DoUnsafeWork(bmp.BackBuffer);
}
는 MyMethod
의 스택에 bmp
에 대한 참조가 남아 :
내가 같은 것을 할 때마다 내가 GC.KeepAlive
을 사용할지 여부를 완전히 명확하지 않다. 다른 한편으로 구현 세부 사항에 의존하는 것처럼 보입니다. 예를 들어 bmp
에 대한 참조를 유지하지 않고도 DoUnsafeWork
을 입력하면 꼬리 호출로 컴파일 할 수 있습니다. 이론적으로
int MyMethod()
{
WriteableBitmap bmp1 = getABitmap();
var ptr = bmp.BackBuffer;
WriteableBitmap bmp2 = getABitmap();
return DoUnsafeWork(ptr, bmp2);
}
이 bmp1
에 대한 참조 메서드가 반환 될 때까지 스택에 남아 있지만 다시는 구현 상세를 사용하는 것 같아 :
마찬가지로, 다음의 가상 코드를 상상한다. 물론 컴파일러는 bmp1
과 bmp2
을 병합하는 것이 자유 롭습니다. 왜냐하면 컴파일러가 결코 그런 일을하지 않을지라도 JITter가 여전히 가능하고 아마도 그렇습니다 (예를 들어 둘 다 동일한 레지스터에 저장함으로써 하나, 다른 하나).
그래서 일반적으로 객체에 대한 유효한 참조 인 지역/인수에 의존해야합니까? 아니면 정확성을 보장하기 위해 항상 GC.KeepAlive
을 사용해야합니까?
특히, 이것은 분명히 FxCop thinks GC.KeepAlive is always bad이므로 수수께끼입니다.
관련 독서 : [? 나는'사용해야 할 때 GC.KeepAlive'] (http://blogs.msdn.com/b/oldnewthing/archive/2010/08/13/ 10049634.aspx) 및 [가비지 수집을 위해 개체를 사용할 수있는시기는 언제입니까?] (http://blogs.msdn.com/b/oldnewthing/archive/2010/08/10/10048149.aspx) Raymond Chen 블로그 –
@DanielPryden 우수 링크; 나는 물었다 전에 첫 번째하지만 두 번째 아닌 봤어요. 이미 물어 보았던 것 이외에,'this'는 현재 객체를 유지하지 못한다고 설명합니다. –