DLL에서 데이터를 가져와야 하는데, 데이터가 가변적(크기가 일정하지 않음)일 경우가 있습니다.

이를 처리하는 방법은 여러 가지가 있는데, 크게 'DLL 외부에서 할당하고 DLL 내부에서 이를 사용하는 방법' 과 'DLL 내부에서 할당하고 DLL 외부에서 이를 사용하는 방법' 으로 나눌 수 있습니다.

전자의 경우 DLL 외부에서 충분한 사이즈의 메모리를 확보하려면 DLL 내부에 메모리를 얼마나 할당해야 하는지 요청해야 하는 번거로움이 생깁니다.(물론, 최대치를 정해버릴 수 있겠지만 가장 나쁜 방법이죠. 고정이 되어 버리기 때문에...)

후자의 경우 DLL 내부에서 사이즈의 메모리를 확보하고 DLL 외부에 메모리를 그대로 보내 주면 되기 때문에 자료를 한 번에 요청할 수 있고, DB 액세스가 필요한 경우 쿼리를 여러 번 실행할 필요가 없기 때문에 더욱 효율적일 수 있습니다.

이 때, 우리가 생각해야 하는 것 중 하나가 메모리 해제인데, DLL 내부에서 메모리를 할당하고 DLL 외부에서 이를 받아서 사용할 경우, 사용은 가능하지만 해제하게 되면 에러가 발생합니다.

이를 해결하기 위해 DLL 외부에서 DLL 내부에 메모리 해제를 요청할 수 있도록 합니다. 메모리 해제를 알려 주고 받아온 메모리 주소를 보내면 DLL 내부에서 메모리를 해제하면 됩니다.

아래는 DLL 내부의 코드와 DLL 외부의 코드입니다.

DLL 내부의 코드
// TESTDLL_API는 __declspec(dllexport)를 표현하는 define 이다.

TESTDLL_API void testMem(char ** ppData, int * nDataCount);

TESTDLL_API void testMem(char ** ppData, int * nDataCount)
{
	// 사이즈를 저장할 수 있는 공간을 NULL로 할당할 때, *ppData 를 메모리 해제
	if( !nDataCount )
	{
		delete [] *ppData;
		return;
	}

	*ppData = new char[10];

	for( int i = 0 ; i < 10 ; i++ )
	{
		*( *(ppData) + i) = i + 'A';
	}

	*nDataCount = 10;
}

DLL 외부의 코드
1
2
3
4
5
6
7
8
9
10
11
char * pData;
int nCount;

testMem(&pData, &nCount);

for( int i = 0 ; i < nCount ; i++ )
{
	printf("-- %c\n", *(pData + i));
}

testMem(&pData, NULL);

위의 두 코드에서 pData, ppData에 대해 메모리 구조(특히 포인터가 가리키는 것)를 직접 그려서 유심히 살펴보기 바랍니다.
메모리 구조만 그려볼 수 있게 되면 100% 이해하게 되는 것입니다.
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by Heart
TAG ,