언어/C&C++ 응용

[TS] Invalid address specified to RTlValidateHeap & DLL개념

차가운오미자 2021. 6. 14. 18:03

에러상황:

 

 

 

// 사용하고 있던 구조체 & 변수 정의 
typedef struct node ={
    NODE* right;
    NODE* left;
    void* data;
}NODE;

NODE* root = ...;
NODE* newRoot = ...;

// 문제가 생긴 부분: 
free(root->data);
newRoot = root->right;

 

자꾸 위 두 줄 에서 문제가 떠서 대체 문제가 뭔지... 싶었다. 'x' 표시가 뜬 줄에 문제가 있은 줄 알고 메모리 공간에 들어가있는 데이터를 일일이 따지며 보았지만 문제를 찾을 수가 없었다. 왜냐면 문제는 그 윗줄에 있었으므로..!

 

경고 메시지로

HEAP[bst2.exe]: Invalid address specified to RtlValidateHeap( 000001E7A9DC0000, 00000060D9EFFC34 )

 

이 떴다. 검색해보니,

(참고한 사이트: https://blog.daum.net/rectork/64)

 

 

dll 에서 메모리를 할당할 때 dll 내에서 구조체 안의 구조체를 malloc하고 이를 free 할 시 생기는 에러라고 한다. 위 블로그 주인님이 작성한 글에서 보면 체크할 것이 다음과 같다고 하는데,

 

1. 포인터에 다른 값을 사용하지 않았는가?

2. dll에서 할당할 메모리를 코드 내에서 free 시키는가?

3. dll과 작성한 코드의 code generation option이 동일한가?

 

보니까 내가 root->data를 free 시키고 있었다...

기존 리스트 들에서 다 따로 데이터 구조체를 만들고서 delete node 시에 하나하나 free 해주다보니 이 코드에서도 free했는데, root는 NODE* 타입이고, 그 안에 data는 void* 타입이다. 즉 나는 void* 타입 데이터를 메모리 하고 있었던 것.......

 

오늘도 이렇게 바보짓 한 건 했다 ^_^

 

참고: 중국블로그

https://blog.csdn.net/chenyujing1234/article/details/8244718

 

 

자꾸 dll, dll해서 dll 이 뭔지도 함께 정리한다.

dll (dynamic link library)

라이브러리를 링크하는 시기에 따라서 static link  dynamic link로 나뉜다.

dynamic link library

는 그 라이브러리 기능 사용 시에만 라이브러리 파일을 참조하여 기능을 호출한다.

- 장점: 메모리 절약, 사용되는 디스크 공간 줄일 수 있다. 프로그램 로드 빠르게 할 수 있다.

static link library

는 컴파일시에 링커에 의해 연결되어 실행파일의 일부분이 된다.

 

dll 종속성

한 dll이 다른 dll를 참조하는 경우 종속성이 생긴다. 참조하는 dll을 옮기거나 수정하면 프로그램에 문제가 생길 수 있다.

 

참고: https://goddaehee.tistory.com/185