HEAP CORRUPTION DELETED
3111 단어 쌓아올리다
오늘 문자열 처리에 관한 프로그램을 썼는데 delete를 진행할 때 HEAP CORRUPTION DELETED 오류가 발생했습니다.
관련 자료를 찾아 오류 원인을 찾아내다.
먼저 하나의 예를 보십시오.
#include <string.h>
#include <iostream>
using namespace std;
int main()
{
char * str;
char *str2 = "hewei";
str = (char *) malloc(strlen(str2)); // , :strlen(str2)+1 '\0', strlen(str2), HEAP CORRUPTION DELETED 。
memcpy(str,str2,strlen(str2)+1);
cout << str << endl;
delete [] str;
return 0;
}
HEAP CORRUPTION DELETED bug를 실행하는 이유는 무엇입니까?
우선 Heap Corruption이 무엇인지 설명합니다.입력이 미리 할당된 공간 크기를 초과하면 Heap Corruption 이라는 공간 뒤의 스토리지 영역을 덮어씁니다.
VC에서 release 모드로 프로그램을 컴파일할 때, 할당 (Heap allocation) 을 할 때malloc를 호출합니다. 10byte 공간을 할당하려면 10byte 공간만 할당하고, debug 모드를 사용할 때 할당 호출은malloc_dbg, 만약 당신이 10byte의 공간을 분배하기만 한다면, 그것은 당신이 원하는 10byte를 제외하고 약 36byte의 공간을 분배할 것입니다. 이것은 얇은 정보를 저장하는 데 사용되며, debug 더미가 분배된 후에 순서대로 하나의 체인으로 연결됩니다.
그럼 메모 중에 뭐가 있는지 다시 한번 봅시다.아니면 위 10byte 분배 공간의 예, 그러면 분배된 10byte 공간의 앞에는 32byte의 추가 정보가 있고 저장된 것은CrtMem Block Header 구조로 DBGINT.H에서 구조에 대한 정의를 찾습니다.
typedef struct _CrtMemBlockHeader
{
// Pointer to the block allocated just before this one:
struct _CrtMemBlockHeader *pBlockHeaderNext;
// Pointer to the block allocated just after this one:
struct _CrtMemBlockHeader *pBlockHeaderPrev;
char *szFileName; // File name
int nLine; // Line number
size_t nDataSize; // Size of user block
int nBlockUse; // Type of block
long lRequest; // Allocation number
// Buffer just before (lower than) the user's memory:
unsigned char gap[nNoMansLandSize];
} _CrtMemBlockHeader;
/* In an actual memory block in the debug heap,
* this structure is followed by:
* unsigned char data[nDataSize];
* unsigned char anotherGap[nNoMansLandSize];
*/
구조의CrtMem Block Header 구조의 두 바늘은 설명할 필요가 없습니다.szFileName은 분배 작업을 시작하는 줄 코드가 저장된 파일의 경로와 이름이고 nLine은 줄 번호입니다.nDataSize는 요청 분배의 크기입니다. 우리의 예는 당연히 10입니다. nBlockUse는 유형이고 lRequest는 요청 번호입니다.마지막 GAP, 일명 NoMans Land는 4byte(nNoMans Land Size=4) 크기의 구역이다. 마지막 몇 줄의 주석을 보면 이 구조 뒤에 사용자가 진정으로 필요로 하는 10byte 데이터 구역이 뒤따르고 그 다음에 4byte의 GAP이 뒤따른다는 것을 알 수 있다. 그러면 사용자가 분배를 신청한 구역은 하나의 머리 구조와 4byte의 GAP에 의해 포장된 것이다.이 10byte 공간을 방출할 때 이 정보를 검사합니다.갭이 할당되면 0xFD로 채워집니다.체크에서 gap의 값이 변경되면 Assert fail 방식으로 오류가 발생합니다.그러나vc6에서 제시한 것은 비교적 이해하기 어렵다.DAMAGE:after Normal block(#dd)at 0xhhhhhhhhhhhhhhhh, vs 2005에서 Heap Corruption Detected를 제시한다!만약 당신이release 버전이라면, 이 오류는 파괴력이 작용할 때까지 잠복할 것이다.
위 예에서는 다음과 같이 설명합니다.
str = (char *) malloc(strlen(str2));
할당된 배열의 크기는 다음과 같습니다:strlen(str2)+1'\0'을 잊지 마십시오. 여기에 strlen(str2)만 할당되어 있으면 HEAP CORRUPTION DELETED 오류가 발생합니다.
할당된 크기가 채워진 시간보다 작으면 겹쳐쓰기가 발생합니다. 즉, 위의 unsigned char gap[nNoMans Land Size];덮어쓰기 때문에 delete[]로 삭제하면 오류가 발생합니다.