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
[51200] Re:동적으로 생성한 데이터를 가지는 구조체 배열 생성 관련 문의드립니다.
장성호 [nasilso] 2188 읽음    2007-11-11 01:04
구조체에 소멸자를 넣어보세요

typedef struct _DATALIST
{
    BYTE* bData;
    long nLen;
    _DATALIST(){bData=NULL;};
    ~_DATALIST()
    {
        icnt++;
        if(bData)delete bData;
    };
} DATALIST;

위와같이 하면   delete될때 자동으로 bData를 free할것입니다.

그런데 문제는  DATALIST *tDataList  를 delete[] tDataList; 와 같이 delete하면
소멸자가 2번 호출되는것이 아니라 여러번 호출됩니다.

즉 2개를 생성했으면 각각delete해줘야하겠네요

    for(int i=1 ; i>=0 ; i-- )
        delete (DATALIST*)(lst+i);

그리고 안전한 삭제를 위해
#define SAFE_DELETE(p)   { if(p) { delete (p);     (p)=NULL; } }

typedef struct _DATALIST
{
    BYTE* bData;
    long nLen;
    _DATALIST(){bData=NULL;};
    ~_DATALIST()
    {
        if(bData)SAFE_DELETE( bData);
    };
} DATALIST;


//----------------------------------------------------------------
그런데 위 방법은 별로..
그냥 아래와 같이 사용하면 delete 안해줘도..

void __fastcall TForm1::Button6Click(TObject *Sender)
{
    TData dt[2];
    DataSetFunc2(dt);

    BYTE bTemp[256] = {0x00,};
    memcpy(bTemp, dt[0].bData, dt[0].nLen);
    memcpy(bTemp, dt[1].bData, dt[1].nLen);
}

지역변수로 선언하면 함수에 들어가면서 생성되고
함수를 빠져나오면 자동 delete되죠
dt가 delete되면서 자동 struct의 소멸자도 호출되죠 2번

//---------------------------------------------------------------------------
객체가 몇개 안되면 위와같이 하기도 하지만
많으면.. 하나씩 생성해서 list 같은데  넣어 뒀다가 사용하는 방법도..

struct대신 TObject를 상속받은 class로 만들어서 생성되는 객체마다 TObjectList에 넣어두면

TObjectList를 delete또는 clear할때  list안에 모든 객체가 삭제됩니다.

//----------------------------------------------------------------------------


답변을 제대로 했는지 모르겠네요

그럼..



짱구오빠 님이 쓰신 글 :
: 구조체 선언부 입니다.
:
: typedef struct {
:     BYTE* bData;
:     long nLen;
: } DATALIST;
:
: 메인 프로그램에서
:
: void __fastcall TScript::DataSetMain(void)
: {
:     DATALIST *tDataList = (DATALIST*)malloc(sizeof(DATALIST)*2);
:    
:     //DLL Function CALL
:     DataSetFunc(tDataList);
:
:     //Data 확인
:     BYTE bTemp[256] = {0x00,};
:     memcpy(bTemp, tDataList[0].bData, tDataList[0].nLen);
:     memcpy(bTemp, tDataList[1].bData, tDataList[1].nLen);
:
:    //DATA free   
:     free(tDataList[0].bData);
:     free(tDataList[1].bData);
:     delete[] tDataList;
: }
:
:
: DLL 에서
:
: void DataSetFunc(DATALIST *tSettList)
: {
:     BYTE bData1[6] = {0x01,0xA2,0x03,0x04,0x05,0x06};
:     BYTE bData2[5] = {0x0A,0x0B,0x0C,0x0D,0x0E};
:     BYTE* DATA1;
:     BYTE* DATA2;
:
:     DATA1 = (BYTE*)malloc(sizeof(bData1));
:     memcpy(DATA1, bData1, sizeof(bData1));
:     tSettList[0].bData = DATA1;    
:     tSettList[0].nLen = sizeof(bData1);
:
:     DATA2 = (BYTE*)malloc(sizeof(bData2));
:     memcpy(DATA2, bData2, sizeof(bData2));
:     tSettList[1].bData = DATA2;    
:     memcpy(tSettList[1].bData, bData2, sizeof(bData2));
:     tSettList[1].nLen = sizeof(bData2);
: }   
:
: 이렇게 코딩했습니다.
:
: 맞게 하는건지 모르겠네요.
: 일단 데이터는 전달 받습니다.
:
: 또한 메인폼에서 free(tDataList)할때
: 데이터부분(구조체의 bData) free가 않됩니다.
: 그래서 직접
:    free(tDataList[0].bData);
:     free(tDataList[1].bData);
: 을 해주구요.
:
: 답변 부탁드립니다.
: 수고하세요.

+ -

관련 글 리스트
51194 동적으로 생성한 데이터를 가지는 구조체 배열 생성 관련 문의드립니다. 짱구오빠 1419 2007/11/10
51200     Re:동적으로 생성한 데이터를 가지는 구조체 배열 생성 관련 문의드립니다. 장성호 2188 2007/11/11
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.