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
[67794] Re:Re:자동차(Form)를 운전자(thread)가 운전해 가면서 , 자동차를 delete하면 어떻게 되죠?
장성호 [nasilso] 1123 읽음    2012-07-20 15:53
문제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하면 어떻게 되죠? 장성호 1191 2012/07/20
67789         Re:자동차(Form)를 운전자(thread)가 운전해 가면서 , 자동차를 delete하면 어떻게 되죠? ㅋㅊㅌㅍㅌㅋㅊㅍㅌㅍ 1078 2012/07/20
67794             Re:Re:자동차(Form)를 운전자(thread)가 운전해 가면서 , 자동차를 delete하면 어떻게 되죠? 장성호 1123 2012/07/20
67795                 Re:Re:Re:자동차(Form)를 운전자(thread)가 운전해 가면서 , 자동차를 delete하면 어떻게 되죠? ㅋㅊㅌㅍㅌㅋㅊㅍㅌㅍ 1165 2012/07/20
67781     Re:도배해서 죄송합니다. 동적제거방법좀알려주세요. 라스코니 1104 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.