안녕하세요? 열심히 C를 공부중인 대학생입니다.
현재 MacBook Pro 2017 / X code 를 사용해서 공부중입니다.
오늘도 열심히 공부하다가 예제 35.1 을 X code 에 넣고 돌렸는데
에러가 납니다... 구글링을 해도 도저히 모르겠더라구요.
그래서 이리저리 실험하다가 아예 free를 빼면 오류없이 돌아간다는 것을 알았습니다.
/
어떻게든 free 를 넣고 싶었던 저는 void free(void *numPtr2) 로 수정해서 돌렸는데 오류없이 돌아갔습니다
과연 이렇게 해도 메모리를 해제하는 건가요?
그리고 오류는 왜 나는 건가요?
(참고로 예제 35.2 의 free(numPtr); 은 무리없이 잘돌아갑니다...
도대체 왜 그러는건지...)
알려주시길 부탁드립니다!!! 감사합니다
p.s 좋은책 만들어주셔서 정말 감사합니다.
온라인 컴파일러는 리눅스 환경에서 실행되는데 문제 없습니다. Run 버튼을 클릭해보세요.
https://glot.io/snippets/fa4z6cb57v
이 예제에서 에러가 발생하게 하려면
free(numPtr2);
부분을
free(numPtr1);
또는
free(*numPtr2);
로 바꾸면 됩니다.
주소 출력 방식과 값은 실행 환경에 따라 달라집니다.
예외가 발생한 원래 코드가 어떤 것인지 캡처로는 알 수 없습니다. 또한, macOS나 XCode가 없어서 원인이 무엇인지는 알 수 없습니다. XCode에서 clang을 C 언어 컴파일러로 사용한다면 위에 링크한 glot.io도 clang을 사용하고 있으니 문제가 없는 것은 알 수 있지만, clang의 버전에 따른 문제인지는 확인하기 어렵습니다.
캡처의 어셈블리를 보면
7행 leaq에서 예외가 발생한 것으로 표기되어 있습니다. 즉, 문제로 생각한 free 부분은 아닙니다. free 부분은 25행에 어셈블리 주석인
; symbol stub for free
부분입니다.
7행은
numPtr1 = &num1; // num1의 메모리 주소를 구하여 numPtr에 할당
이 부분이며 이 부분에서 에러가 발생할 이유는 없어 보입니다.
어셈블리 코드 7행의 leaq는 load effective address(quad)입니다. quad는 4를 뜻합니다. 컴퓨터에서는 CPU와 저장 장치 사이를 오가는 데이터 단위가 워드(word)이고, quad는 quad word라는 뜻입니다. 보통 word가 16비트이고, quad word이면 4배이니 64비트입니다. 64비트로 컴파일했기 때문입니다.
leaq는 유효 주소를 불러온다는 뜻이고, 해당 주소를 %rcx에 저장한다는 뜻입니다. 이 부분에서 왜 오류인지는 모르겠습니다.
leaq src, dst
이 문법은 src의 주소를 dst에 로드하라는 뜻입니다. src의 값이 아니라 src의 주소를 가져옵니다. 코드에서는 &num1 부분일 겁니다.(7행)
참고하세요.
아직 어셈블리어를 공부하지 않아서... 일단 free 가 문제일줄 알았는데 그게 아니었다니 충격이었습니다...
그렇게 한동안 고민하다가
컴퓨터도 껐다 키면 대부분의 오류가 해결되는 것처럼
X code 에서 새로운 프로젝트를 만들어서 실행했습니다.
잘 되더군요.
감사합니다... 참... 못난 학생이네요...
정말 좋은 책 써주셔서 다시금 감사드립니다.
p.s '전자제품은 대부분 껏다 키면 고쳐진다' - 영화, 스카이스크래퍼 중