HEAP CORRUPTION DETECTED error
반응형
출처 : http://javawork.egloos.com/2244196
보통 아래와 같은 코드에서 HEAP CORRUPTION DETECTED 에러가 납니다.
자기가 소유하지 않은 메모리, 즉 배열의 경계를 넘어서 초기화한다거나 하면 나중에 해당 객체가 해제될때 이 에러가 발생하는데, 최근에 특이한 환경에서 이 에러를 경험했습니다.
이렇게만 해도 HEAP CORRUPTION DETECTED 에러가 발생했습니다. TestClass는 라이브러리에 정의된 클래스라는 것 말고는 특이할게 전혀 없는 클래스였습니다.
문제는 라이브러리와 어플리케이션의 프로젝트 설정의 차이점 때문이었습니다.
라이브러리의 프로젝트 세팅
어플리케이션의 프로젝트 세팅
이렇게 구조체 멤버 맞춤이 다르면 delete 할 때 에러가 발생하더군요. 설정에 따라 구조체의 길이를 다르게 인식하기 때문에 발생하는 문제인것 같습니다. 이런류의 문제는 링크 에러를 내는 것도 아니고 컴파일 에러를 내는 것도 아니라 찾기가 어렵습니다
보통 아래와 같은 코드에서 HEAP CORRUPTION DETECTED 에러가 납니다.
struct TestStruct
{
int serial;
short level;
double postion;
};
typedef std::vector<TestStruct> TestVector;
TestVector test_vec;
TestStruct tt;
test_vec.push_back(tt);
memset(&test_vec[0], 0, sizeof(TestVector));
자기가 소유하지 않은 메모리, 즉 배열의 경계를 넘어서 초기화한다거나 하면 나중에 해당 객체가 해제될때 이 에러가 발생하는데, 최근에 특이한 환경에서 이 에러를 경험했습니다.
TestClass* p = new TestClass();
...
delete p;
이렇게만 해도 HEAP CORRUPTION DETECTED 에러가 발생했습니다. TestClass는 라이브러리에 정의된 클래스라는 것 말고는 특이할게 전혀 없는 클래스였습니다.
문제는 라이브러리와 어플리케이션의 프로젝트 설정의 차이점 때문이었습니다.
라이브러리의 프로젝트 세팅
어플리케이션의 프로젝트 세팅
이렇게 구조체 멤버 맞춤이 다르면 delete 할 때 에러가 발생하더군요. 설정에 따라 구조체의 길이를 다르게 인식하기 때문에 발생하는 문제인것 같습니다. 이런류의 문제는 링크 에러를 내는 것도 아니고 컴파일 에러를 내는 것도 아니라 찾기가 어렵습니다
'유용한 것들_etc' 카테고리의 다른 글
visual studio 2008 intellisense 검정글씨 (0) | 2010.06.18 |
---|---|
관리자 계정으로 만들기. (0) | 2010.05.07 |
Run-Time Check Failure #0 (0) | 2010.04.17 |
윈도우 sys파일 리소스 파일에 추가하기 (0) | 2010.04.14 |
msiexec를 이용한 프로그램 실행 (0) | 2010.04.13 |
TAGS.