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
[67786] 자동차(Form)를 운전자(thread)가 운전해 가면서 , 자동차를 delete하면 어떻게 되죠?
장성호 [nasilso] 1289 읽음    2012-07-20 10:42
코드에 여러가지 문제점이 있는데요

[문제점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 도배해서 죄송합니다. 동적제거방법좀알려주세요. ㅋㅊㅌㅍㅌㅋㅊㅍㅌㅍ 1178 2012/07/20
67786     자동차(Form)를 운전자(thread)가 운전해 가면서 , 자동차를 delete하면 어떻게 되죠? 장성호 1289 2012/07/20
67789         Re:자동차(Form)를 운전자(thread)가 운전해 가면서 , 자동차를 delete하면 어떻게 되죠? ㅋㅊㅌㅍㅌㅋㅊㅍㅌㅍ 1191 2012/07/20
67794             Re:Re:자동차(Form)를 운전자(thread)가 운전해 가면서 , 자동차를 delete하면 어떻게 되죠? 장성호 1229 2012/07/20
67795                 Re:Re:Re:자동차(Form)를 운전자(thread)가 운전해 가면서 , 자동차를 delete하면 어떻게 되죠? ㅋㅊㅌㅍㅌㅋㅊㅍㅌㅍ 1272 2012/07/20
67781     Re:도배해서 죄송합니다. 동적제거방법좀알려주세요. 라스코니 1205 2012/07/20
67782         Re:Re:도배해서 죄송합니다. 동적제거방법좀알려주세요. ㅋㅊㅌㅍㅌㅋㅊㅍㅌㅍ 1155 2012/07/20
67783             Re:Re:Re:도배해서 죄송합니다. 동적제거방법좀알려주세요. ㅋㅊㅌㅍㅌㅋㅊㅍㅌㅍ 1274 2012/07/20
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.