코드에 여러가지 문제점이 있는데요
[문제점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();
: }
: //---------------------------------------------------------------------------