티스토리 뷰
HEAP CORRUPTION DETECTED
코드는 멀티바이트 기준, memcpy_s()는 int크기로 복사, strncpy_s() 는 __int64 크기 복사 가능.
아래 코드 주석처리한 10행과 같이 memcpy_s() 로 하면 문제없는데
11행 같이 strncpy_s() 를 이용해서 힙에 할당한 변수 a에 문자열을 복사하면 15행에서 힙 해제할때 아래 그림과 같은 오류가 발생한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 |
int nLength = 0;
int nMaxSize = 100;
TCHAR* a = new TCHAR[nMaxSize];
ZeroMemory(a, nMaxSize);
CString str(TEXT("12345"));
int nStrSize = str.GetLength();
while (nLength < nMaxSize - nStrSize)
{
//memcpy_s(a + nLength, nMaxSize, str.GetBuffer(), nStrSize);
strncpy_s(a + nLength, nMaxSize, str, str.GetLength());
//strncpy_s(a + nLength, str.GetLength() + 1, str, str.GetLength());
nLength += str.GetLength();
}
delete[] a; |
cs |
원인은 힙에 할당한 크기보다 많이 사용할 경우 발생하는것 같다.
memcpy_s() 두번째 인수는 복사 목적지 a의 크기를 지정하고, 네번쩨 인수인 nStrSize 만큼 복사한다.
strncpy_s() 두번째 인수는 memcpy_s() 처럼 복사 복적지 a 의 크기를 지정하면 그 크기 만큼 복사되어 힙 해제할때 오류가 나는거 같다.
결국, 아래 코드 12행과 같이 strncpy_s() 두번째 인수를 복사할 문자열의 길이 + 1 로 지정해줘야 한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 |
int nLength = 0;
int nMaxSize = 100;
TCHAR* a = new TCHAR[nMaxSize];
ZeroMemory(a, nMaxSize);
CString str(TEXT("12345"));
int nStrSize = str.GetLength();
while (nLength < nMaxSize - nStrSize)
{
//memcpy_s(a + nLength, nMaxSize, str.GetBuffer(), nStrSize);
//strncpy_s(a + nLength, nMaxSize, str, str.GetLength());
strncpy_s(a + nLength, str.GetLength() + 1, str, str.GetLength());
nLength += str.GetLength();
}
delete[] a; |
cs |
char* toekn;
char* szKeyData[10+1];
strncpy_s(szKeyData, token, 1); // 인수 3개(복사목적지, 복사소스, 복사할 문자수) 도 사용가능
위 처럼 했는데도 계속 같은 문제가 발생하면 힙 설정때 실제 크기보다 크게 만든다.
_tcstok_s() 를 반복해서 사용하는 경우 위와 같은 방법으로 해결이 안되어 힙을 1024 더 크게 지정하니 같은 오류가 안뜬다.