정의되지 않은 동작이란 무엇일까??

개발하는 곰댕이·2021년 4월 9일
0

C

목록 보기
3/3

1. 정의되지 않은 동작이란?

정의되지 않은 동작은 때때로 정상적으로 동작할 수도 있지만 OS 및 컴파일러 상황에 따라 잘못된 동작을 할 수도 있는 우리가 정확하게 알 수 없는 동작을 일컽는 말이다.

간단하게 예시를 들어보자면 free는 malloc으로 할당된 메모리영역을 다시 사용할 수 있게 풀어주는 함수라고 알고있다. 하지만 때때로 free는 모든 메모리를 0으로 초기화시켜주지 않고 그대로 남겨두기도 한다. 한마디로 그냥 사용되지 못하게 잡아둔 것을 단순히 풀어주기만 하기도 한다는 소리다.

즉, free함수를 사용한 메모리 안의 값은 다시 사용할 수 없는 것처럼 생각되지만 free를 사용 한 이후에도 할당이 해제된 값들을 사용할 수도 있다.

아래 사진을 보자

2. 정의되지 않은 동작의 예시

보이는 바와 같이 나는 분명 free를 한 상태이다. 그러고 다시 str을 출력을 해 보았는데 여전히 접근이 가능하고 출력도 free이전과 똑같이 나온다.

하지만 여기에서 다른 문자열 str2를 할당해 보았다.

그러자 이전에 있던 str또한 바뀌는게 보인다.

주소는?? 똑같은걸 보니 단순히 이전에 사용되었던 메모리영역을 재사용한 것으로 보인다. 이 부분은 OS나 기타 다른 상황에따라 초기화가 될 수도 있고 안 될 수도 있다.

그렇다면 free를 하지 않으면 어떨까??

답은 간단하다. 이전에 할당된 메모리영역 뒤에 할당이 된다. 이런식으로 free함수를 사용한 이후의 str처럼 우리가 생각한 동작 이외의 동작을 정의되지 않은 동작이라고 한다.

3. free된 함수에 접근하는 것을 방지하는 법

할당이 해제가 된 포인터를 댕글링 포인터라고 한다. 위 내용처럼 댕글링 포인터에 접근을 하면 어떤 식으로 동작을 하게 될 지 알 수 없으니 free를 한 이후에는 해당 포인터를 0으로 초기화 시켜주는게 좋다고 한다. 그렇게 되면 컴파일 오류가 나거나 값이 출력이 안 되기 때문에 오류가 났다는것을 바로 알 수 있어서 잘못된 동작을 줄일 수 있다.

Can still print a string after I freed it? - stackoverflow

0개의 댓글