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
[67795] Re:Re:Re:자동차(Form)를 운전자(thread)가 운전해 가면서 , 자동차를 delete하면 어떻게 되죠?
ㅋㅊㅌㅍㅌㅋㅊㅍㅌㅍ [] 1165 읽음    2012-07-20 17:48
감사합니다! 열심히하겠습니당


장성호 님이 쓰신 글 :
: 문제1. 변수초기화를 해주지 않았네요
:
: TImage *I[10];
:
: 변수의 객체 TImage를 delete 한다고 해서..
:
: TImage 개체가 해제 되지 I[10] 변수의  Pointer값은
: 초기화 해주지 않았으니 못쓰는 쓰레기 값이 들어있겠네요
:
:
:  delete I[i];
: I[i]=NULL;   //delete후에 NULL로 초기화 해줘야 ..
: 

:
:
: 문제2
: 그리고 변수 이름이 좀...
:
: 1. 지역변수인지 global변수 인지 구분이 안되구요
: 2. 전역변후 int i 는 아무데도 쓰지 않는데.. 삭제하는것이 좋을듯..
:
:
: 기타...
:
: 그럼..
:
:
: ㅋㅊㅌㅍㅌㅋㅊㅍㅌㅍ 님이 쓰신 글 :
: : 장성호님 시간내주셔서 감사합니다.
: : 문제점을 반영하여 소스를 다시 써보았습니다.
: : 그런데 제가 원하는게 동적생성 I[0]을 생성하고
: : delete I[0] 제거하고 다시 동적생성 I[0] delete I[0] 반복을 하고자합니다.
: : 생성과 제거를 여러번 반복하는거죠...
: : 지금 이 소스로 하면 제가 원하는소스가 될까요..?
: :
: : //---------------------------------------------------------------------------
: :
: : #include <vcl.h>
: : #pragma hdrstop
: :
: : #include "Unit1.h"
: : TImage *I[10];
: : int X=0;
: : int i=0;
: : //---------------------------------------------------------------------------
: : #pragma package(smart_init)
: : #pragma resource "*.dfm"
: : TForm1 *Form1;
: : //---------------------------------------------------------------------------
: : __fastcall TForm1::TForm1(TComponent* Owner)
: :     : TForm(Owner)
: : {
: : }
: : //---------------------------------------------------------------------------
: :
: : void __fastcall TForm1::Button1Click(TObject *Sender)
: : {
: :     Edit1->Text = IntToStr(X);
: :     I[X] = new TImage(this);
: :     I[X]->Name = String("Imgcnd_") + X  + String("_");
: :     I[X]->Width = 189;
: :     I[X]->Height = 91;
: :     I[X]->Stretch = true;
: :     I[X]->AutoSize = false;
: :     I[X]->Visible = true;
: :     I[X]->Parent = Form1;
: :     I[X]->Picture->LoadFromFile("C:\\동현프로그램\\이미지\\순서도-선언.bmp");
: :     I[X]->Left = X;
: :     I[X]->Top = 0;
: :     I[X]->Transparent = true;
: :
: :     X++;
: : }
: : //---------------------------------------------------------------------------
: :
: :
: : void __fastcall TForm1::Button3Click(TObject *Sender)
: : {
: :     int i = 0;
: :
: :      for(int i = 0; i < 10; i++)
: :      {
: :         if( I[i] != NULL)
: :         {
: :             delete I[i];
: :         }
: :         else
: :         {
: :             break;
: :         }
: :      }
: :
: :      X = 0;
: : }
: : //---------------------------------------------------------------------------
: :
: :
: :
: :
: :
: : 장성호 님이 쓰신 글 :
: : : 코드에 여러가지 문제점이 있는데요
: : :
: : : [문제점1]
: : :
: : : Form위의 버튼이나 이벤트를 무슨 작업을 하는것은?
: : :
: : : 마치
: : :
: : : 운전자가 자동차를 운전하면서 자동차의 기능을 조작하는것에 비유할수 있습니다.
: : :
: : : 운전자는 thread 이구
: : : 자동차는 Form이라 할수 있습니다.
: : :
: : : 님께서 동적 생성한 TImage는  자동차 유리에 붙이느 스티커에 비유할수 있구요
: : :
: : :
: : : ---------------------------------------
: : :
: : : 자동차를 운전해서 달리면서 (Form의 이벤트에서 어떤 작업을 하는 경우)
: : :
: : : 자동차에 붙인 스티커(TImage)는 제거할수 있습니다.
: : :
: : : 하지만 자동차(Form1)을 제거하면, 운전자는 어떻게 될까요?
: : :
: : : 현재 타고있는 자동차(Form1)을 제거하고 똑같은 모양의 자동차(TForm1 클래스)를 만들어서
: : :
: : : 방금 타고있던 자리(Form1변수)에 가져다 놓으면 ..
: : :
: : : 운전자는 새 자동차로 순간이동 하나요?
: : :
: : : 이 경우 짤없이 access-violation이 나는 것입니다.
: : :
: : :
: : : 님께서 작성하지 다음 코드는 마치 제가 위에 설명한것과 같은 상황을 만드는 코드입니다.
: : :
: : :
: : :  void __fastcall TForm1::Button3Click(TObject *Sender)
: : :  {
: : :      delete Form1;
: : :    
: : :      // 생략..
: : : 
: : :      Application->CreateForm(__classid(TForm1), &Form1);
: : :      Form1->Show();
: : :  }
: : : 

: : :
: : :
: : :
: : : [문제점2]
: : :
: : : 그리고  자동차를 제거하면
: : : 자동차 안에 있는 모든 것이 같이 없어집니다
: : :
: : : 즉 Form1을 제거하면 Form위에 버튼 뿐만 아니라 TImage도 모두 없어집니다.
: : :
: : : 운전자(thread)가 자동차(Form1)를 타고 있는 상황이 아니더라도
: : : 자동차를 없애면(delete) , 자동차 안에 있는 모든 부품(TButton을 포함에 동적생성한 모드 TImage) 들이 같이 없어집니다.
: : :
: : : 위코드에 문제점은 Form1을 제거하는 순간
: : : 동적생서한 모든 TImage가 자동 free되어 버립니다.
: : :
: : : 그런데 님께서는 TImgae를 다시 delete하려고 하네요
: : : 이런 경우도 어김없이 access-violation이 나게 되겠죠
: : :
: : :
: : : [문제점3]
: : :
: : : TImage *I[100000]
: : :
: : : 10만개의 TImage * 변수를 미리 잡아 놓으셨네요
: : : 10만 x 4Byte (32bit 컴파일러라고 가정) 이면   40만 Byte 즉 400MByte를 걍  쓰고 있네요
: : :
: : : TImage를 실제로 생성(new)하면
: : : TImage에 load되는 Image크기에 따라 다르겠지만..
: : : TImage한개당 수kbyte에서 수십~수백MByte도 될수있는데..
: : :
: : : 쓸데없이 변수를 너무 크게 잡아 놓고 쓰네요(메모리 낭비)
: : :
: : : 동적 List를 쓰세요
: : :
: : :
: : : 그럼..
: : :
: : :
: : :
: : :
: : : ㅋㅊㅌㅍㅌㅋㅊㅍㅌㅍ 님이 쓰신 글 :
: : : : 이렇게해서 NULL값 넣어주는데도... 에러가뜨네요.. 방법좀알려주세요
: : : :
: : : :
: : : : //---------------------------------------------------------------------------
: : : :
: : : : #include <vcl.h>
: : : : #pragma hdrstop
: : : :
: : : : #include "Unit1.h"
: : : : TImage *I[100000];
: : : : AnsiString a;
: : : : int X=0;
: : : : int i=0;
: : : : TButton* cls;
: : : : //---------------------------------------------------------------------------
: : : : #pragma package(smart_init)
: : : : #pragma resource "*.dfm"
: : : : TForm1 *Form1;
: : : : //---------------------------------------------------------------------------
: : : : __fastcall TForm1::TForm1(TComponent* Owner)
: : : :     : TForm(Owner)
: : : : {
: : : : }
: : : : //---------------------------------------------------------------------------
: : : :
: : : : void __fastcall TForm1::Button1Click(TObject *Sender)
: : : : {
: : : :     I[X] = new TImage(this);
: : : :     I[X]->Name = String("Imgcnd_") + X  + String("_");
: : : :     I[X]->Width = 189;
: : : :     I[X]->Height = 91;
: : : :     I[X]->Stretch = true;
: : : :     I[X]->AutoSize = false;
: : : :     I[X]->Visible = true;
: : : :     I[X]->Parent = Form1;
: : : :     I[X]->Picture->LoadFromFile("C:WEFWEF.bmp");
: : : :     I[X]->Left = X;
: : : :     I[X]->Top = 0;
: : : :     I[X]->Transparent = true;
: : : :
: : : :     X++;
: : : : }
: : : : //---------------------------------------------------------------------------
: : : :
: : : :
: : : : void __fastcall TForm1::Button3Click(TObject *Sender)
: : : : {
: : : :     int i = 0;
: : : :
: : : :     delete Form1;
: : : :     delete I[i];
: : : :
: : : :     for(int i = 0; i < 5; i++)
: : : :     {
: : : :             I[i]=NULL;
: : : :     }
: : : :
: : : :     X = 0;
: : : :
: : : :     Application->CreateForm(__classid(TForm1), &Form1);
: : : :     Form1->Show();
: : : : }
: : : : //---------------------------------------------------------------------------

+ -

관련 글 리스트
67780 도배해서 죄송합니다. 동적제거방법좀알려주세요. ㅋㅊㅌㅍㅌㅋㅊㅍㅌㅍ 1075 2012/07/20
67786     자동차(Form)를 운전자(thread)가 운전해 가면서 , 자동차를 delete하면 어떻게 되죠? 장성호 1192 2012/07/20
67789         Re:자동차(Form)를 운전자(thread)가 운전해 가면서 , 자동차를 delete하면 어떻게 되죠? ㅋㅊㅌㅍㅌㅋㅊㅍㅌㅍ 1078 2012/07/20
67794             Re:Re:자동차(Form)를 운전자(thread)가 운전해 가면서 , 자동차를 delete하면 어떻게 되죠? 장성호 1124 2012/07/20
67795                 Re:Re:Re:자동차(Form)를 운전자(thread)가 운전해 가면서 , 자동차를 delete하면 어떻게 되죠? ㅋㅊㅌㅍㅌㅋㅊㅍㅌㅍ 1165 2012/07/20
67781     Re:도배해서 죄송합니다. 동적제거방법좀알려주세요. 라스코니 1105 2012/07/20
67782         Re:Re:도배해서 죄송합니다. 동적제거방법좀알려주세요. ㅋㅊㅌㅍㅌㅋㅊㅍㅌㅍ 1054 2012/07/20
67783             Re:Re:Re:도배해서 죄송합니다. 동적제거방법좀알려주세요. ㅋㅊㅌㅍㅌㅋㅊㅍㅌㅍ 1174 2012/07/20
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.