함수에 인자를 넘길때, 이미 메모리를 할당 해서 정보를 넣고 넘기거나 해야 겠죠.
아니면 함수를 호출한 녀석이, return값을 잘 활용하고 난 후 꼭 NULL이 아니면 delete를 해 주거나 해야 겠죠.
하지만, 그럴 경우, 함수가 내부적으로 동적으로 할당 받는것인지 아닌지를 알수가 없거나, 깜빡 하게 된다면?
메모리 할당화 해제를 이곳 저곳에서 하는것은 위험합니다.
뭐 아래 함수에 우겨 넣는다 치면
char * __fastcall TMainForm::VersionData(char* cPdata,char *cdata)
{
char cVer[20]={0,};
if(cPdata==NULL)
return NULL;
sprintf(cPdata,"%c%c%c%c%c%c%c",cdata[1],cdata[2],cdata[3],cdata[5],cdata[6],cdata[8],cdata[10]);
//memcpy(dest, cPdata, strlen(cdata)+1);
return cPdata;
}
메모리 할당은 위 함수 부르는 녀석이..
char * pBuf=NULL;
pBuf=new char[strlen(cdata)+1];
VersionData(pBuf, cdata);
다 쓰고 난 뒤
if(pData!=NULL) delete[] pBuf;
뭐 이런식으로요?
VersionData의 return도 저 상태로는 별 의미가 없으니..고쳐야 겠네요.
빨간눈 님이 쓰신 글 :
: strtok에서나 기타 return 으로 char * 값을 갖는 API함수들은 기능 구현을 어떻게 해야될지 의문이 있어서요~
: return으로 char *를 갖는 값은 내부 API에서 포인터에 동적 할당(힙???)과 해제가 이루어져야되는데
: 메모리 할당은 되는데 해제 언제, 어케해야될까요?
:
: char * __fastcall TMainForm::VersionData(char *cdata)
: {
: char *cPdata;
: char cVer[20]={0,};
: cPdata = new char[strlen(cdata)+1];
: sprintf(cPdata,"%c%c%c%c%c%c%c",cdata[1],cdata[2],cdata[3],cdata[5],cdata[6],cdata[8],cdata[10]);
: //memcpy(dest, cPdata, strlen(cdata)+1);
: return cPdata;
: }
|