|
구조체에 소멸자를 넣어보세요
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);
: 을 해주구요.
:
: 답변 부탁드립니다.
: 수고하세요.
|