강께르의 개발일지

[에러] _CrtisValidHeapPointer(block)에 대해 본문

프로그래밍/미분류

[에러] _CrtisValidHeapPointer(block)에 대해

강께르 2021. 7. 5. 23:20

1. 어떤 상황이었는가?

- WinApi를 이용해 플래피버드를 만들던 중이었다.

맘에 드는 결과물 / 이걸 만들다가 발생한 에피소드

- 이 게임을 만들기 위해 나는 세 개의 클래스를 사용하고 있었다.

- 어떤 물체를 나타낼 오브젝트를 아울러 이야기할 클래스로 CObject와 이것을 부모 클래스로 상속받는 플레이어 클래스인 CPlayer와 발판과 방해물 클래스인 CLand가 있다.

- 이를 메인에 인클루드하여 프로그래밍하고 있었다. 메인에서 플레이어와 발판은 CPlayer와 CLand를 각각 포인터 변수로 하나씩 만들어 동적할당을 하였다.

- 그리고 여러 개수를 등장시켜야 할 이 게임에서 방해물을 여러 개 만들어야 하는데, 그것을 위해 배열과 같은 자료구조가 필요했다.

- 그래서 나는 연습 삼을 겸 배열말고 vector 템플릿 클래스를 사용해보기로 했다. vector<CLand>로 선언하여 데이터를 관리하고 반복자를 선언해 접근할 수 있도록 했다.

- 그리고 CObject 클래스에는 공통적으로 오브젝트라면 가져야할 공통적인 것을 변수로 선언했다. 그 중 하나가 그 오브젝트에 씌워야 할 이미지였다. 이 이미지도 CImage라는 클래스로 관리하는데 이에 대한 포인터 변수로 선언하여 동적 할당하여 쓸 것이다.

- 그리고 이미지를 동적할당하는 것에 생각이 나 CObject의 소멸자가 호출할 때, 동적할당한 이미지를 delete로 해제하려고 했다.

 

- 이런 상황에서 vector<CLand> 변수를 이용해 객체를 추가하며 초기화하려는 중이었다.

- 결과에 대해 확인할 겸해서 컴파일을 돌렸는데 _CrtisValidHeapPointer(block) 에러 메시지 팝업창이 떴다.

 

2. _CrtisValidHeapPointer(block)

 

_crtisvalidheappointer(block) - Google 검색

_CrtIsValidHeapPointer(bloc... social.msdn.microsoft.com

www.google.com

- 팝업창은 위에 링크에서 확인하도록 하자.

- 팝업창의 에러메시지에서 heap이라는 단어를 보고 저번에 배운 동적할당을 통해 잡히는 메모리 영역이 힙 영역인 것을 떠올렸다.

- 그래서 컴파일하기 전 가장 최근에 타이핑한 동적할당이 vector와 관련되어있다는 것을 보고 이를 기준으로 에러를 찾아보려고 했다.

 

- 할당과 선언 등 이곳 저곳 건드리면서 봤지만 아무런 이상이 없었다. 오히려 컴퓨터 한 대 정권질러버리고 싶은 맘이 들었다.

- 검색을 통해 에러 메시지에 관한 예시를 돌아봤는데 이 글을 보게 됐다.

 

_CrtisValidHeapPointer(block) 런타임 에러

#include int main() { // 10x10 동적배열 생성 int** arr = new int* [10]; for (int alloc = 0; alloc < 10; alloc++) arr[alloc] = new int[10]; // 배열을 전부 0으로 초기화 for (int index_d = 0; index_d <..

doomed-lab.tistory.com

- 이 글을 보고 해결 방법을 떠올리게 됐다. 이전에 공부했던 영역인 소멸, 메모리 해제에 대한 문제였던 것이다.

- 이 에러 메시지는 이미 해제, 소멸한 메모리 영역에 대해서 명시된 코드에 의해 다시 해제, 소멸을 시도하려다가 발생하는 메시지이다.

- 그래서 어느 부분에서 해제와 소멸을 중복하여 사용했는지 찾아야 한다.

- 그 문제는 바로 부모 클래스인 CObject의 소멸자에 있는 CImage 포인터 변수의 메모리 해제였다. 그것을 한 줄을 지우니 정상적으로 작동하는 것을 확인할 수 있었다.

 

- 왜 그 부분이 중복이었는지는 생각을 좀 더 해봐야겠다. 하지만 다음엔 이런 메시지가 다시 뜨면 동적 할당한 메모리의 중복된 소멸, 해제 요청이 있었는지 확인해볼 필요가 있을 것 같다.

'프로그래밍 > 미분류' 카테고리의 다른 글

[그래픽] 더블 버퍼링  (0) 2021.07.01