c++ 기초 플러스 보고 있는데 좀 이해가 안되서 질문 좀 할게
위와 같은 코드가 있어.
clone2에서 구조체 변수를 하나 선언하는데 저런 방식으로 선언하면 스택영역에 만들어진다고 알고 있거든.
그다음에 함수가 끝나면 스택영역에 있던 변수들은 없어진다고 알고 있는데 여기서 이 구조체를 함수 끝날 때 return 레퍼런스로 반환하잖아.
그 이후의 전개를 보면 이 함수안에서 생성된 구조체 메모리(?)는 사라지지 않고 계속 남아 사용이 되더라고.....
내가 알기로 스택영역에 있는 변수들은 해당 변수를 생성했던 스코프의 함수가 종료되면 다 정리된다고 알고 있는데 얘는 아닌거 같단 말이지..
스택영역에 선언된 변수 또는 메모리라고 할지라도 어떤 게 그대로 남아 있는지 조건과 그 남아있는 거는 언제 정리가 되는지 알고 싶어.
와 코드 가운데정렬 실화야?
아.. 코드 자동 중앙 정렬 해버리네 ㅡㅡ 다시 스샷 찍어서 올릴게
아 ㅋㅋ 자동이지 ㅋㅋㅋㅋ 설마 진짜 저런스타일로 쓰진않겠지 ㅋㅋㅋㅋㅋㅋㅋ
그런거 궁금할땐 주소 찍어보는게 제일이야
로컬변수에 대한 참조를 리턴하는 건 잘못된 행동 맞는데
음 뒤에 잘못되었다고 나오네..
newguy 선언할때 찍히는 메모리 주소? - dc App
아니면 리턴값? - dc App
newguy 선언할때 생성되는 스택영역의 메모리 자체를 말하는 거임.
참고로 스코프를 벗어나서 메모리에서 사라지는 객체가 그 즉시 사라진다는 보장은 어디에도 없음 어느순간까지는 존재할 수 있기 때문에 반환후에 접근된다고 사라지지 않는게 아님
자바는 그걸 GC에서 해주니까 그런데, C는 함수 시작시 스택영역에 선언되었던 변수들은 함수 종료와 함께 같이 사라진다고 알고 있음. 다만 new 연산자로 선언했던 것들은 힙영역에 생성되기 때문에 이것들은 delete 해줘야 하고.. C도 니말처럼 그런건가?
형 그럼 내코드 봐줄수있음? 애매한데 - dc App
그러니까 메모리에서 해제해야할 의무는 생기는네 실제 그게 실시간으로 바로 사라진다는 보장은 없는거임
아항... 그렇구나
좀더 로우로 설명하면 함수 리턴하고 스택이 축소되면서 원래 쓰던 공간이 안 쓰이는 공간으로 바뀌는건데 그게 나중에 다시 덮어쓰이기 전까지는 계속 데이터가 남아있을 수도 있는거지 다만 이건 사용자가 예측하고 사용할 수 있는 부분이 아니기 때문에 사용하면 안되는 것
아 맞다 ㅋㅋㅋ 덮어 쓰는방식이었지! 완전 이해되었어 고맙다!! ㅎㅎㅎㅎㅎㅎㅎ