https://gall.dcinside.com/mgallery/board/view/?id=tcpl&no=3935
대충
int* a = new int[3];
이렇게 있으면 int 3개만큼 메모리 할당하고
delete[] a;
이거로 그만큼을 해제하잖아
근데 만약 계산 실수로
a[3] = 1;
이렇게 하면 할당된 메모리 벗어난 부분에 접근해서 생기는 다른 문제는 제쳐두더라도
이후에 delete[] a; 할때 heap corruption 뜨는데 delete[]가 정확히 처음 할당했던 만큼만 해제하는거 아니야?
검색해보면 new[]할때 크기가 헤드 세그먼트에 저장되서 나중에 delete[]가 정확히 얼마나 해제해야 할지 알 수 있다는데
그 크기보다 더 큰 범위를 확인하는거야? 저 예시로는 a[3]은 할당한 메모리 범위 밖이잖아
에러 메시지에 보면 힙버퍼 끝 이후에도 썼다고 나오는데 delete[]가 그게 쓰레기값인지 잘못해서 접근해서 쓴건지 알수가 있음?
요약하면
1. delete[]는 처음에 할당한 사이즈만큼만 해제하는거 아님?
2. 어떻게 사이즈 넘겨서 접근한걸 알고 에러띄움?
이라는거야
요전번에 관련된 문제 틀리고 복습해보다가 의문생겨서
c++은 malloc이랑 free를 그렇게 쓰는거임? 존나편안해보이네 - dc App
컴파일러가 처리하는 부분일걸? 원래 쓰기로 한 부분의 바깥에 데이터를 썼으니까 컴파일러는 알거아냐
애초에 c++은 프로그래머를 믿고 맡기기 때문에 그런거 검사 안하는게 디폴트라고 알고있어
결론적으로는 개발 환경따라 다를거같음
근데 숫자 입력받아서 그만큼 동적할당하고 범위 밖에 접근한다음에 해제할때도 뜨는데 그럼 런타임에 처리하는거 아님?
아니면 os가 처리하는거 아닐까?
new가 추적함
그럼 new가 범위 밖에 접근해서 썼는지 다 저장하고 있다가 delete할때 터트리는거임?
1. C++ new도 결국엔 malloc() 씀 (최적화가 잘 되면 그냥 스택에 할당하기도 하지만 그건 논외로). 2. malloc으로 메모리 영역 할당하면, 할당된 chunk 앞뒤로 메타데이터를 저장하는 공간이 있음. 여기에 chunk size (현재 사용중인 경우) 또는 다음 free chunk를 가리키는 포인터 등이 저장됨. delete (결국 free)하면 정확히 할당한만큼 해제할 수 있는 게, 이 메타데이터를 참조하기 때문임. 3. 아주 약간의 out-of-bound 접근을 하게 되면, 바로 옆 chunk를 덮어쓰거나 (heap overflow), 메타데이터 영역을 오염시키게 됨. 4. 메타데이터가 오염된 경우, 당장은 문제가 없더라도, free 하려고 하면 이상한 동작을 하게 될 수 있음.
5. OS가 관여하는 게 아니냐는 질문에 대해: 기본적으로 malloc은 libc (user-level library)에 정의돼 있음. 한 번에 큰 영역 할당해두고 (mmap 등 시스템콜 사용), libc allocator가 이 메모리를 쪼개서 나눠주는 구조임. malloc, free는 웬만해서는 OS가 관여하는 작업이 아님.
오 ㄳㄳ
쌉고수네 ㄷㄷ 학부에서는 이렇게 자세하게 안가르쳐주던데