c++ 구조체에 인스턴스를 담아 내보냈을 때 살아있는 문제에 관하여..
글쓴이: hun4000 / 작성시간: 일, 2014/01/12 - 11:55오후
다음과 같은 코드를 짜는데 이해가 가지 않는 부분이 있어서 이렇게 문의드립니다. ㅠ
typedef unsinged char BYTE; struct testt { LPBYTE bytes; }; void test(testt& t) { BYTE a[10] = { 1 }; t.bytes = a; } void main() { testt ttt; test(ttt); cout << (int)(ttt.bytes[0]) << endl; ttt.bytes[0] = 10; cout << (int)(ttt.bytes[0]) << endl; }
test 함수에서 a라는 배열을 생성하고 매개변수로 받은 레퍼런스 변수 t에 그 주소값을 넣어줬는데요
이 부분에서 a변수는 test 함수가 끝나면 사라지게 되는거 아닌가요?
그런데 main 함수에서 해당 주소를 참조하여 값을 출력해봤더니 잘 출력이 되네요..
혹시 메모리만 그렇게 초기화 해놓은 게 아닌가 싶어서 해당 값을 바꿔보기도 했는데
제대로 바뀌네요...
이게 된다고 한다면 이런식으로 코드를 계속 작성하려고 하는데 혹시 나중에 큰 문제가 생기거나 하게 될까요? (해당메모리가 다른값으로 지워진다던가...)
Forums:
> 혹시 나중에 큰 문제가 생기거나 하게
> 혹시 나중에 큰 문제가 생기거나 하게 될까요?
네 문제가 됩니다. 절대로 하면 안되는 행동입니다.
a를 스태틱이나 글로벌로 지정하시면 됩니다만
이러면 최소한 액세스 자체는 안전해지지만 다른놈이 값을 덮어씌웠을 경우 무방비가 되겠죠.
그런 상황에서 쓸 수 있는 게 몇가지 있는데..
얼른 생각나는건 test함수에서 a에 해당하는 메모리를 스택 변수로 잡는게 아니고 malloc등으로 동적 할당 하는것입니다. 그리고 메모리를 다 쓰고 나면 free로 지워주는 방법.
예 그렇죠. free로 지워주는게 귀찮습니다. 그래서 C/C++에도 메모리 관리를 도와주는 여러 가지 기법들이 발달한 것입니다.
또는, 현재 C++을 사용하고 계시니 구조체를 만들고 굳이 거기에 종속된 전역함수를 따로 만드실 필요는 없습니다. 두가지를 합쳐서 다시 클래스로 선언해버리셔도 됩니다. a는 클래스 멤버 변수로 선언하고요. (지역변수면 어차피 마찬가지임.)
이경우 클래스 인스턴트가 사라지기 전까진 a의 주소를 맘껏 쓰실 수 있습니다. 언급된 소스만으론 이게 제일 자연스러워 보이네요.
아니면 뭐.. 그냥 구조체 안에 a를 선언해도 되지만 이건 넘어가겠습니다. 그렇게 하지 않으신 이유가 있을테니 말이죠
--
댓글 달기