|
: for(int i = 1; i <= 10 ; i++)
: {
: Log->n = i;
: Log->msg.sprintf("%04d",i);
: que->Push(Log);
: }
위소스를 잘생각해보세요..
포인터는 실제 내용을 저장할수 있는 공간이 없습니다.
다만 저장할 수 있는 곳을 가리키고(POINT) 있을 뿐입니다.
제가 좀전에 알려드린 소스중에서 한줄이 빠져있습니다.
위 소스처럼 하면..
Log 포인터는 항상 한곳만 Point하게 됩니다.
그래서 처음에 1을 넣는곳과 두번째에 2를 넣는곳은 같은 곳이됩니다.
이런식으로 맨 마지막에 해당이 되므로 제일 마지막에 변경한 값만
남아 있게 됩니다.
마찬가지로..
Pop 시킬때는..
Pop후 메모리 해제가 일어나는데..
1~10까지의 내용이 모두 같은곳을 Point하고 있으므로..
그래서 첫번째 pop후엔 메모리 해제가 일어나서..
두번째 pop부터는 유효하지 않은 곳을 참고하게됩니다.
따라서 메모리 참조 오류가 발생하게 됩니다.
빠져있는 부분은 new로해서.. 메모리를 할당시켜주는 부분입니다.
하안인 님이 쓰신 글 :
: 하안인 님이 쓰신 글 :
: : 답변 감사드립니다.
: :
: : 근데
: : [Link Fatal error]unable to open file "MMTOOLS_C5.LIB'
: :
: : 빌더에서 탐색해봐도 위 파일은 없던데요.
: : 어떻게 하면 되는건 가요.
: :
:
: 다시 새로 프로그램해서 실행하니 링크에러는 없는데
: 퀴에 집어넌 내용이
: for(int i = 1; i <= 10 ; i++)
: {
: Log->n = i;
: Log->msg.sprintf("%04d",i);
: que->Push(Log);
: }
:
: 로 집어넣었으니 n값이 1에서 10까지 나와야 하는데
: 10개값 모두 10으로만 나옵니다.
:
: //출력하는 부분
: void __fastcall TForm1::Button2Click(TObject *Sender)
: {
: while (que->Count() > 0)
: {
: Log2 = (TLOGBUF*)que->Pop();
:
: ListBox1->Items->Add(IntToStr(Log2->n)+String("--")+Log2->msg);
: }
: }
:
: 그리고 종료를 하면 메모리해제 Log2에서 에러가 발생되는 데요
: Log의 메모리는 정상적으로 제거되는것 같은데..
: void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
: {
: delete Log;
: delete Log2; //
: delete que;
: }
:
:
|