찾아줘서 고마워 ㅠㅠㅠ
힙 메모리에 있던 양이 realloc으로 작아지니깐 안되던거였어..
컴파일러 괜히 욕했네... 미안해..
근데 realloc을 안쓰면 뭐씀???
내가 리버싱을 하고 싶어서
C -> 윈32 -> 운영체제(윈도우) -> 어셈블리어 -> 리버싱
이렇게 공부할라고 하는데(ONLY 독학으로)
C는 윤성우성님의 열혈C 지금 이제 마지막문제 풀거고
윈도우즈 API정복 책 사놨는데
realloc 안쓰고 딴거쓰고 이런거 어떻게함??
지금 WIN32 하지말고 C프로그래밍 파워 업그레이드(저자 : ㅇㅅㅇ성님) 해볼까??
realloc 쓰지 말라고 하는 놈들은 헛소리하는 거고 써도 된다. 근데 너처럼 새로운 항목이 추가될 때마다 realloc을 부르면 메모리 단편화(fragmentation) 현상이 발생하기 때문에 한 번 할당 받을 때마다 1개씩 늘리는 게 아니라 32개, 64개 이렇게 많이 할당받아놓고 부족할 때마다 새로 할당받게끔 하는 방법이 좋다. 아니면 리눅스처럼 매번 할때마다 할당 크기를 2배씩 늘리던가.
ㄴ ㅇㅎㅇㅎ ㄳㄳ 참고하겠슴다
그리고 VirtualAlloc 쓰라고 한 놈도 있는데 VirtualAlloc보다 malloc이 더 빠르다. malloc의 원리를 안다면 그런 소리 못하지. 힙 메모리라는 개념 자체가 특별한 게 아니라 처음에 OS로부터 메모리를 많이 할당받아와서 알아서 그걸 쪼개서 쓰는 그런 개념인데 페이지 테이블 조작하는 VirtualAlloc 보단 빠르지. 그리고 VirtualAlloc API는 페이지 관련 API라서 4KB 단위의 메모리 할당만 가능하고.
단편화가 왜 생기냐면 메모리에 A A B C C 이렇게 있다고 해보자. 근데 B를 realloc해서 1에서 2로 바꾸면 내부적으로 메모리를 다른 주소로 옮기게 되는데(A A ? C C B B) 그럼 원래 B가 있던 자리는 빈 공간(?로 표기하겠다)이 된다. 이제 또 B B 다음에 다른 데이터가 들어와 있다고 해보자(A A ? C C B B E E E). 다시 B를 3으로 realloc하면 A A ? C C ? ? E E E B B B처럼 자꾸 빈 공간 똥이 생겨나는데 이렇게 작은 크기의 빈 공간은 이거보다 큰 메모리 할당할 때는 쓸 수도 없다. 이런 일이 극도로 반복되면 결국 메모리 전체 공간은 저렇게 빈 공간이 조각처럼 흩어지게 되는데 그럼 일정 크기 이상의 메모리는 할당받을 수 없는 상태가 되어 버린다.