c++에서 문자열을 담을때 char 배열에 담을 수 있고, 아니면 char *, string 자료형을 지원한다.
char 형 배열은 c와 동일하게 스택에 공간이 만들어지기 때문에 각각의 인덱스에 접근해서 값을 변경할 수 있다는 특징이 있지만,
같은 자료형, 같은 크기의 배열이라도 통째로 대입하는게 불가능하다.
char str1[11] = "HelloWorld";
char str2[11];
str2 = str1; // <- 불가능
char * 역시 C와 마찬가지로 문자열을 바로 집어넣는다면, 저장되는 문자열은 읽기전용 메모리인 .data영역에 저장되어 인덱스 접근해서 읽기는 가능하지만, 쓰기가 불가능하다. char *변수는 스택에 저장되고 리터럴 문자열의 주소를 가리키게 되는구조이다.
C++에서는 string 이라는 자료형을 지원한다.
이녀석은 하는 행동이 일반적이지 않다.
-> c_str()이라는 메서드는 string 객체를 c스타일로 새로운 배열에 할당 후 그 주소를 리턴해주는 함수이기 때문에 아래와 같은 결과가 나오게된다.
string str1 = "test1313";
string str2;
str2 = str1;
str1[2] = 'X';
cout << str1 << endl; // -> teXt1313
cout << str2 << endl; // -> test1313
일단 스택공간에 각각 24, 28바이트 공간이 할당되고, char형 배열처럼 각 바이트 공간을 문자로 하나씩 채운다.
대략 22 바이트까지는 스택에 배열형태로 존재하게 되지만, 그 이상 길이의 문자열이 들어오는 경우 힙 공간에 할당된다.
문자열이 길이서 힙에 할당된다고 해도 배열의 공간은 할당된 채로 유지된다.
아래 사진에서 a, str1, b, str2, c 순서대로 선언됐고, str1의 문자열 길이가 길기때문에 힙 공간에 저장됐다.
하지만 a, b, c의 주소는 대략 32바이트씩 떨어져있게 된다.
힙공간에 한번 할당되고나면 문자열 크기를 줄인다 해도 힙공간에 그대로 남아있게 된다.
힙공간에 할당되어 있지만, free는 불가능하다.
.c_str()로 접근해도 불가능하다.
delete도 안됨
!!! 결론 !!!
string이라는 클래스같은게 있고, 그 클래스안에는 메소드들이 있는데 그중 하나가 c_str()인것같다.
전체 28바이트중에 22바이트정도가 넘어갔을때 힙으로 이동하는 이유는 기본적으로 22바이트까지 담을 수 있고, 그 다음엔 바로 저장한 바이트의 길이를 담는 필드가 2byte로 존재한다.
ccp로 따졌을때 ccp[16]부터 [43] 까지 str2 string이다.
문자열이 대략 300byte로 길어져서 힙메모리로 이동됐을때
스택에 있는 string 변수는 힙메모리의 주소(ccp[16]~ccp[23] 8byte)와 길이(ccp[24-25] 2byte)를 저장하고 있다. (4byte 이상 일지도 모름 총 5byte가 남기때문)
스택에 최대로 존재하는 경우 사이즈를 포함한 남는 메모리(파란색)
스트링 클래스 관련 메소드
https://blockdmask.tistory.com/338
c++의 진짜 스트링 클래스
https://wiki.kldp.org/HOWTO/html/C++Programming-HOWTO/standard-string.html
string to char *
https://www.techiedelight.com/convert-std-string-char-cpp/
'프로그래밍' 카테고리의 다른 글
C++ 상속 (0) | 2021.11.07 |
---|---|
c++ 연산자 오버로딩 (0) | 2021.11.06 |
C++ 정리 (복잡한건 따로 정리함) (0) | 2021.11.06 |
C++ friend 키워드 (0) | 2021.11.06 |
c++ 클래스 사용 예제 (0) | 2021.11.05 |