leetcode 오류 보고의 ERROR: AddressSanitizer: attempting double-free on 0x7fa0cd690800 in thread T0:...

배경


#173 두 갈래 검색 트리 교체기를 쓸 때 다음과 같은 오류가 발생했습니다.

오보 내용

=================================================================
==45==ERROR: AddressSanitizer: attempting double-free on 0x7fa0cd690800 in thread T0:
    #0 0x7fa0cca11b8f in __interceptor_free (/usr/lib/x86_64-linux-gnu/libasan.so.5+0x10bb8f)
    #4 0x7fa0cb9f682f in __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x2082f)
0x7fa0cd690800 is located 0 bytes inside of 400008-byte region [0x7fa0cd690800,0x7fa0cd6f2288)
freed by thread T0 here:
    #0 0x7fa0cca11b8f in __interceptor_free (/usr/lib/x86_64-linux-gnu/libasan.so.5+0x10bb8f)
    #4 0x7fa0cb9f682f in __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x2082f)
previously allocated by thread T0 here:
    #0 0x7fa0cca11f88 in malloc (/usr/lib/x86_64-linux-gnu/libasan.so.5+0x10bf88)
    #5 0x7fa0cb9f682f in __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x2082f)
SUMMARY: AddressSanitizer: double-free (/usr/lib/x86_64-linux-gnu/libasan.so.5+0x10bb8f) in __interceptor_free
==45==ABORTING

번역하다


그가 무작정 잘못 보고한 정보를 번역해 보아라.
ERROR: AddressSanitizer: attempting double-free

 : 

실제 작업


석방이 키워드는 우리의 코드가 방출될 때 문제가 생겼다는 것을 설명한다.
그래서 우리는free () 함수가 있는 곳을 찾았다.
void bSTIteratorFree(BSTIterator* obj) {
    free(obj->val);
    free(obj);
}

언뜻 봐도 문제없잖아. 안에 있는 데이터 결과(여기는 1차원 그룹val)를 먼저 방출한 다음에 전체 구조체 변수를 방출해.
그런데 다시 생각해 보니 문제가 생겼다.만약 obj->val 자체가 비어 있다면?이때 어디에서 왔습니까obj->val?망치를 풀어볼까?
설명하자면, BSTIterator는 창고입니다. obj->top은 창고 꼭대기 바늘입니다.
그래서 obj->val을 방출하기 전에 판단을 했습니다. 다음과 같습니다.
void bSTIteratorFree(BSTIterator* obj) {
    if(obj->val) free(obj->val);
    free(obj);
}

그러나 이때 발견할 수 있듯이 전A도 할 수 없다.
다시 한 번 생각해 보면 구조체 변수obj가 그 자체가 존재하지 않는다면 어떻게 된 것인가obj->val?
따라서 다음과 같이 수정됩니다.
void bSTIteratorFree(BSTIterator* obj) {
    if(obj && obj->val) free(obj->val);
    free(obj);
}

이렇게 하면 위의 오보 문제를 해결하고 문제를 완성할 수 있다.제목이 뭔지 보고 싶어요?전송문을 눌러주세요

후기


다음과 같은 문장:
BSTIterator* obj = (BSTIterator *)malloc(sizeof(BSTIterator));
if(!obj) return NULL;
obj->top = 0;

두 번째 줄의 판단 문장은 있어도 되고 없어도 되는 것 같지만 메모리 공간 분배에 실패하면?
이렇게 되면obj는 아직 빈 바늘일 뿐인데 또 무슨 일이야obj->top?
이상 판단, 습관 기르기.
만약 우리가 좋은 습관을 길렀다면, 잘못을 보고할 확률이 어찌 많이 떨어지지 않겠는가?
자성, 자성!
만약 당신에게 도움이 된다면.(이것은 강렬한 암시였다)

좋은 웹페이지 즐겨찾기