C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 Q&A
C++Builder Programming Q&A
[67655] Re:Re:기본적인 질문인데요 찾아봐도 설명이 없어서요
축구 [] 1097 읽음    2012-06-26 09:23
아 그렇군요 제가 평소에 구조체를 만들고 stTest test; 이런식으로만 썼거덩요

이렇게 써야되는줄 알고, 근데 파일안에 읽고 쓰고 하는 부분을 공부하고있었는데 저장은 잘되는데 읽어올때 문제가 발생하더라고여

구조체에는 가변 길이 멤버변수가 있었거덩요. char *testfile 이런식으로 선언해놓고 쓸때는 new 해서 쓰는 근데 저 크기를

test.testfile = new char[크기가변하는 int형 변수]; 이렇게 저장을 했었는데요. int형 변수에 5를 집어 넣었는데 아무리 읽어와도 8자

리를 읽어오는거에요 그래서 선언을 stTest *test = new stTest; 로바꾸어 선언을 하니까 제대로 들어오더라고여 전 선언만 틀리고

결과는 똑같은줄 알았는데 그게 아니더라고요. 그래서 어떨때 어떤 선언을 해야하는지 그게 궁금해서요.


정대기 님이 쓰신 글 :
: 축구 님이 쓰신 글 :
: : 예를들어 구조체를 쓸때
: :
: : stTest란 구조체가있을때
: :
: : 선언을 stTest test; 이렇게 하던지
: :
: : stTest *test; 이렇게도 하고,
: :
: : stTest *test = new stTest;  이런 식으로도 하는데요.
: :
: : 이거에 차이점이 무엇인가요?? 어떤경우에 어떤 선언을 써야 하는건지 설명좀 부탁드려요
:
: >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
:
: 네, 안녕하세요?
:
: 초보 시절엔 궁금한 내용이긴하지요....
:
: 약간은 메모리 구조를 이해해야 하는데....
:
: 일단, 사용하는 방법에 따라 메모리 영역을 다르게 생성합니다.
: 우선 대략 실제 런타임 메모리 영역이
: 코드영역, 데이터영역, 힙영역, 스택영역으로 생깁니다.
: 메모리 모델에 따라, 컴파일러의 종류에 따라 alias 는 좀 달라지긴하는데...
:
: 1) stTest test; 이렇게 하시면, 선언하는 위치에 따라 조금 다른데, 지역 블럭에 선언되면 스택 영역에 생성이 되고,
:     아니면, 데이터 영역에 생성이 될 겁니다.
:     이 경우 멤버변수나 매쏘드를 접근할 경우는 test.member; test.method(); 로 접근을 합니다.
:     변수의 생명 주기는 스택일 경우, 매쏘드 리턴을 하면 스택에서 제거될 것이고, 데이터 영역은 상황에따라, 프로그램이
:     종료될때까지 살아남을 것입니다.
:
: 2)  stTest *test = new stTest;
:      이 표현은 힙에 동적 생성이 되는 건데, 반드시 프로그래머가 delete test, test=0; 이런식으로 제거를 해 줘야 합니다.
:      물론 이건 구조체 혹은 객체 포인터가 되기 때문에 test가 정상적으로 메모리 할당을 받아야 하고, 널이 아닐 경우
:      test->member; test->method(); 의 표현을 사용해야 합니다.
:
: 3) 마지막으로는 1), 2)를 결합한 건데,  stTest test; 이렇게하고나서, stTest *p = &test;
:     이렇게사용을 합니다. 상황에 따라 단일 포인터를 이용해 서로 다른 객체나 구조체를 접근할 수 있기때문에 사용합니다.
:     또는 함수의 인자로 넘겨줄때, 객체를 직접 넘겨주면 크기가 커지는데, 포인터로 넘기면, 기본적으로 32비트에선 4바이트만
:     인자로 넘어갑니다. 특히 객체의 어레이를 넘길땐 차이가 아주 많이 날겁니다. 물론 이경우 주의할 점은 지역블럭의 변수를
:     선언하고 포인터를 가지고 지역블럭을 넘나들면 상황에따라 아주 위험합니다. 초/중급 개발자들도 매우 실수를 많이 하던데,
:     스택변수는 리턴하면 없어진다는 점을 반드시 명심해야 합니다.  
:
:      중요한건 2) 경우는 개발자가 직접 메모리 해제를 해 줘야 한다는 건데요. 이 변수나 객체의 라이프싸이클 관리를 제대로하지 못하면
:      메모리 누수가 발생하게됩니다. 물론 이 경우도 프로그램이 종료되면 힙은 모두 제거되지만, 서버같은 경우라면, 런타임시 메모리 누수
:      로 인해 서비스가 멈추게 될 겁니다.
:      따라서 동적 메모리 관리는 C/C++에서 고수가 되어도 쉬운 상황은 아닙니다. 특히, delete 되고 난 후에도 포인터를 사용할 려고 하는
:      상황도 생깁니다. 이런 경우는 dangling 포인터라고 하고, 자바 같은 경우는 null 포인터 예외가 발생되는 것입니다.
:
:      이 부분은 자바에서 가비지컬렉터라는 것을 사용하여, 개발자가 delete를 해 주지 않아도 되도록 된 것입니다.
:      때문에 상대적으로 자바는 서버에 유리한 점이 많습니다.
:
:      도움이 되었는지 궁금하군요. 짧은 지식으로 너무 장황하게 설명한 것 같네요.

+ -

관련 글 리스트
67642 기본적인 질문인데요 찾아봐도 설명이 없어서요 축구 1045 2012/06/25
67648     Re:기본적인 질문인데요 찾아봐도 설명이 없어서요 정대기 1112 2012/06/25
67655         Re:Re:기본적인 질문인데요 찾아봐도 설명이 없어서요 축구 1097 2012/06/26
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.