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
[67789] Re:자동차(Form)를 운전자(thread)가 운전해 가면서 , 자동차를 delete하면 어떻게 되죠?
ㅋㅊㅌㅍㅌㅋㅊㅍㅌㅍ [] 1078 읽음    2012-07-20 14:10
장성호님 시간내주셔서 감사합니다.
문제점을 반영하여 소스를 다시 써보았습니다.
그런데 제가 원하는게 동적생성 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하면 어떻게 되죠? ㅋㅊㅌㅍㅌㅋㅊㅍㅌㅍ 1166 2012/07/20
67781     Re:도배해서 죄송합니다. 동적제거방법좀알려주세요. 라스코니 1105 2012/07/20
67782         Re:Re:도배해서 죄송합니다. 동적제거방법좀알려주세요. ㅋㅊㅌㅍㅌㅋㅊㅍㅌㅍ 1055 2012/07/20
67783             Re:Re:Re:도배해서 죄송합니다. 동적제거방법좀알려주세요. ㅋㅊㅌㅍㅌㅋㅊㅍㅌㅍ 1175 2012/07/20
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.