자문자답 공부

strcpy(vector.data) / unicode length / 지역 변수 참조 리턴

Roka_is_back 2023. 12. 27.

FileManager 만들다가 실수하거나 궁금해서 실험해본 내용들

https://rokaisback.tistory.com/m/44

11. ScriptReader/FileManager/

FileManager ReadFile 기능을 구현하였다. 만든 함수들 함수 설명 ReadFile 파일 내용을 읽는 함수이다. 1. CatPath (): _ePath 로 들어온 type에 따른 Path 정보와 _tcPath 정보를 이어붙인다.(읽고자하는 파일 주소

rokaisback.tistory.com


 

filemanager => readfile()

구현 의도는 문자열의 길이를 동적으로 설정할 수 있도록 getline으로 받아오지 않고
get을 이용하여 문자를 하나 하나 따로 받아서 vector에 저장한다.
'\n' 문자를 만나면 문자열을 동적 할당한다.
 
이때 주의할 점이  2가지 있다.

1. vecWords.data() 는 문자열이 아니다.

_tcscpy를 쓰면 안되는데, 이는 문자열 끼리의 복사가 아니기 때문이다.
만약 그냥 복사해버리면 data() 는 \0 문자를 가지지 않기 때문에 해당 메모리를 이상하게 복제한다.

위 : 원래 메모리 아래: cpy된 메모리

fd (free defence) 위치도 기존에 할당받은 메모리에서 달라지고 이상하게 된 것을 볼 수 있다.
이렇게 되면 나중에 메모리를 delete 할때 에러가 발생한다.
 

2. Length * STR_LENGTH_MULTIPLIER 를 해줘야 한다.

define.h 에 정의해둠.

유니코드의 경우 한글자당 2 byte를 차지하기 때문에 memcpy를 할때 length * 2를 해줘야 원하는대로 동작한다.
 

3. 지역변수를 참조 리턴하면 안된다.

안된다는건 알고 있는데 정확히 확인해보기 위해 실험해봤다.

이렇게만 했을 때는 잘 되는것 처럼 1이 출력된다.
하지만 이는 착각이다. 스택에서 지역 변수가 점유하던 메모리 부분이 아직 해제가 되지 않아 발생하는 현상이다.
만약 GetData와 출력 사이에 명령어를 좀 더 끼워 넣으면 그동안 정리가 되기 때문에 다른 값이 출력된다.
 
 

 

실험 1)다른 함수로 지역변수를 선언했을때 값이 바뀔까?

\

 

Test() 실행 후 data가 abc로 변경된걸 볼 수 있다.
 

실험 2)다른 함수에 명령줄이 추가되면 어떻게 될까?

주소가 달라진다. 추측하기로는 명령줄이 스택에 쌓이면서 뒤로 밀려난게 아닐까 한다.

GetData()
Test()

그럼 GetData에도 명령줄을 추가하면 똑같을까? YES

GetData()
Test()

 

실험 3) 출력

strcpy_s 말고는 값이 날아간다.
(이유는 아무리 생각해도 모르겠음.
나온 추측중 하나가 printf_s 함수 내에서 차지한 스택이 기존 스택 메모리를 밀어버리고 무언가 데이터를 위치 시켜서 그런게 아닐까 싶음.)

 
 
예전에 공부했던 함수 호출과 스택 메모리 관련 내용.
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

댓글