문제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();
: : : }
: : : //---------------------------------------------------------------------------