2012-05-17 6 views
0

하나의 변경 가능한 문자열 객체를 만듭니다. 이제는 한 번만 할당했지만 개체를 ​​여러 번 릴리스했습니다. 기본적인 메모리 관리 규칙에 따르면 이것은 잘못된 것입니다. 그러나 충돌이 발생해야하지만 결코 발생하지 않습니다. 일부 EXC_BAD_ACCESS 오류가 예상됩니다. 응용 프로그램이 충돌하지 않는 이유는왜 EXC_BAD_ACCESS가 발생하지 않습니까?

malloc: *** error for object 0x6d5ac60: double free 
*** set a breakpoint in malloc_error_break to debug 

:

나는 오류를 받았다?

NSMutableString *firstOwner = [[NSMutableString alloc] init]; 
[firstOwner release]; 
[firstOwner release]; 
[firstOwner release]; 
NSMutableString *temporaryObject = firstOwner; 
[temporaryObject release]; 
[temporaryObject release]; 
+1

더 이상 메모리 블록이 필요 없다고 메모리 관리 시스템에 알 렸습니다. 그 후에 다른 용도로 사용하거나 사용하지 않을 수도 있습니다. 충돌을 일으키는 값으로 설정된다는 보장은 없습니다. –

답변

3

크래시가 발생하지 않는다고해서 다른 사람에게 발생하지 않는다는 것을 의미하지는 않습니다.

메모리 관리 오류가 발생한 후에도 앱이 계속 절름 거리는 경우를 보여줍니다. 맹목적으로 과도하게 공개 된 것을 제외하고는 객체 참조로 다른 작업을 수행하지 않으므로 충돌이 발생하지 않을 수 있습니다.

하지만 나중에 "firstOwner"또는 "temporaryObject"을 사용하거나 액세스하려고 시도하면 절대적으로 EXC_BAD_ACCESS와 충돌합니다. 존재하지 않거나 해방 된 객체에 대한 액세스가 이러한 종류의 충돌의 주요 원인입니다.

관련 문제