테스트에서 메모리가 샜는데, 새는 곳이 성공한 경로였습니다. 함수는 임시 버퍼를 할당하고, 호출자가 소유할 결과로 파싱한 뒤, 임시 버퍼를 errdefer allocator.free(scratch)로 해제했습니다. 오류 경로는 전부 해제합니다. 성공 반환은 해제하지 않았고, 테스트가 끝날 때 std.testing.allocator가 누수를 보고했습니다.
레퍼런스는 이 점에서 정확합니다. errdefer는 함수가 오류로 반환할 때, 그리고 그때만 블록을 빠져나가며 식을 실행합니다. 평범한 반환은 오류 반환이 아닙니다.
errdefer가 맞는 경우는 따로 있습니다. 성공하면 호출자 것이 되고 실패할 때만 해제해야 하는 버퍼입니다. 임시 버퍼는 어느 경로에서든 함수 것입니다. 그건 defer입니다.
그러니 이 키워드는 성공 반환 뒤에 할당을 누가 소유하는지를 기록합니다. errdefer는 호출자라고 말합니다. defer는 함수 밖의 누구도 아니라고 말합니다. 하나를 고르는 일은 정리 스타일이 아니라 소유권 결정입니다. C에서는 같은 선택이 goto 정리 블록에서 성공 경로가 어느 레이블을 건너뛰는지에 숨어 있습니다.