FileManager 만들다가 실수하거나 궁금해서 실험해본 내용들
https://rokaisback.tistory.com/m/44
11. ScriptReader/FileManager/
FileManager ReadFile 기능을 구현하였다. 만든 함수들 함수 설명 ReadFile 파일 내용을 읽는 함수이다. 1. CatPath (): _ePath 로 들어온 type에 따른 Path 정보와 _tcPath 정보를 이어붙인다.(읽고자하는 파일 주소
rokaisback.tistory.com
![](https://blog.kakaocdn.net/dn/bvXpSv/btsCLq75sRF/zkfl7TuzE9z7PL74d5huK1/img.png)
구현 의도는 문자열의 길이를 동적으로 설정할 수 있도록 getline으로 받아오지 않고
get을 이용하여 문자를 하나 하나 따로 받아서 vector에 저장한다.
'\n' 문자를 만나면 문자열을 동적 할당한다.
이때 주의할 점이 2가지 있다.
1. vecWords.data() 는 문자열이 아니다.
_tcscpy를 쓰면 안되는데, 이는 문자열 끼리의 복사가 아니기 때문이다.
만약 그냥 복사해버리면 data() 는 \0 문자를 가지지 않기 때문에 해당 메모리를 이상하게 복제한다.
![](https://blog.kakaocdn.net/dn/kOhe0/btsCEHXiBHP/eKO0pTsKM53m4tD9A7jxc0/img.png)
fd (free defence) 위치도 기존에 할당받은 메모리에서 달라지고 이상하게 된 것을 볼 수 있다.
이렇게 되면 나중에 메모리를 delete 할때 에러가 발생한다.
2. Length * STR_LENGTH_MULTIPLIER 를 해줘야 한다.
![](https://blog.kakaocdn.net/dn/cR0c7F/btsCK6IAbPF/BStOXmmy9sNwNqlhwSxSjK/img.png)
유니코드의 경우 한글자당 2 byte를 차지하기 때문에 memcpy를 할때 length * 2를 해줘야 원하는대로 동작한다.
3. 지역변수를 참조 리턴하면 안된다.
안된다는건 알고 있는데 정확히 확인해보기 위해 실험해봤다.
![](https://blog.kakaocdn.net/dn/bmW3U0/btsCLobq3oT/kohM1nY0qKS7SV4bbrDdv1/img.png)
![](https://blog.kakaocdn.net/dn/7yXXi/btsCAjCNJAY/IFRIT5TKj3gQKxBe3bgjZk/img.png)
![](https://blog.kakaocdn.net/dn/br1VVB/btsCJjuV7MB/kyPKXNlx9N9Iwpx7EKTDFk/img.png)
이렇게만 했을 때는 잘 되는것 처럼 1이 출력된다.
하지만 이는 착각이다. 스택에서 지역 변수가 점유하던 메모리 부분이 아직 해제가 되지 않아 발생하는 현상이다.
만약 GetData와 출력 사이에 명령어를 좀 더 끼워 넣으면 그동안 정리가 되기 때문에 다른 값이 출력된다.
![](https://blog.kakaocdn.net/dn/co1CYx/btsCKrzvMcB/0ZC0enwegYbOiAS7LhCczk/img.png)
![](https://blog.kakaocdn.net/dn/cPkDq1/btsCF9F7ToJ/xQHeUEdNJ7nWAk5rowW9fK/img.png)
실험 1)다른 함수로 지역변수를 선언했을때 값이 바뀔까?
![](https://blog.kakaocdn.net/dn/cRzN0U/btsCIHo70Sd/hWqwPSx8MoGqT1SmPTq18K/img.png)
![](https://blog.kakaocdn.net/dn/oeQ61/btsCMyZhBPp/AwKngICR8VdbUkmUjT6Bz0/img.png)
![](https://blog.kakaocdn.net/dn/lCTqE/btsCOBVuGrE/kVqPJYp7PGIPCSrYBunYaK/img.png)
Test() 실행 후 data가 abc로 변경된걸 볼 수 있다.
실험 2)다른 함수에 명령줄이 추가되면 어떻게 될까?
![](https://blog.kakaocdn.net/dn/pK0t3/btsCMpacPrb/wbFPXCrDzbOXcPZDLT6cp0/img.png)
주소가 달라진다. 추측하기로는 명령줄이 스택에 쌓이면서 뒤로 밀려난게 아닐까 한다.
![](https://blog.kakaocdn.net/dn/555qN/btsCAjJBQav/yKSjST0y4LMrMqCiGdGLG0/img.png)
![](https://blog.kakaocdn.net/dn/Rzwhe/btsCN4DBvla/UDS0wzvZjWTznop2eLblRk/img.png)
그럼 GetData에도 명령줄을 추가하면 똑같을까? YES
![](https://blog.kakaocdn.net/dn/bR9MHK/btsCF81CJK9/uUIixAtnv7VKsmomPX21S1/img.png)
![](https://blog.kakaocdn.net/dn/1fc3L/btsCJjIxypr/yjHcoaiXL628Bfzt0JXCj1/img.png)
![](https://blog.kakaocdn.net/dn/Nqjor/btsCBNqaq9a/TrpzG2uzMOKqIAY2kBVrP0/img.png)
실험 3) 출력
strcpy_s 말고는 값이 날아간다.
(이유는 아무리 생각해도 모르겠음.
나온 추측중 하나가 printf_s 함수 내에서 차지한 스택이 기존 스택 메모리를 밀어버리고 무언가 데이터를 위치 시켜서 그런게 아닐까 싶음.)
![](https://blog.kakaocdn.net/dn/dPBj36/btsCLqAn3sK/YLEOXrJQdB8DKNXzr7DnUK/img.png)
![](https://blog.kakaocdn.net/dn/VP2Qi/btsCOF4EKb6/JDEkCRzuQCl6OemJO6gRj0/img.png)
예전에 공부했던 함수 호출과 스택 메모리 관련 내용.
https://ramingstudy.tistory.com/62
함수 호출시 스택 메모리
https://ko.wikipedia.org/wiki/%EC%BD%9C_%EC%8A%A4%ED%83%9D 콜 스택 - 위키백과, 우리 모두의 백과사전 위키백과, 우리 모두의 백과사전. 상향 축적 스택의 콜 스택 레이아웃. 콜 스택(call stack) 이란 컴퓨터 프로
ramingstudy.tistory.com
'자문자답 공부' 카테고리의 다른 글
Struct와 Class 의 차이 (0) | 2024.02.23 |
---|---|
Virtual 키워드 (0) | 2024.02.21 |
[DirectX11] 공전, 자전, 부모 Mat (2) | 2024.01.02 |
[Directx11] 태양계 과제 (1) | 2023.12.30 |
ThreadPool (1) | 2023.11.24 |
댓글