문제

malloc을 사용할 때, 오류가있는 코어 덤프가 생성되는 경우 :

malloc(): memory corruption: ....... ***

이것은 Malloc이 자유롭게 할당 할 수없는 메모리를 할당하려고했음을 의미합니까? 그렇다면 이것의 원인은 무엇입니까?

도움이 되었습니까?

해결책

그것은 당신의 malloc 구현에 전적으로 의존하지만, 일반적으로 이것이 의미하는 것은 그 malloc 이전의 어느 시점에서 무언가가 크기보다 malloced 버퍼에 더 많은 데이터를 썼다는 것입니다.

많은 Malloc 구현은 데이터의 일부를 메모리와 함께 인라인으로 저장합니다.

+--------------------------------+
|14 bytes -> Padding             | 
+--------------------------------+
|2 bytes -> Internal malloc info |
+--------------------------------+
|6 bytes -> Your data            |
+--------------------------------+
|8 bytes -> Padding              |
+--------------------------------+
|2 bytes -> Internal malloc info |
+--------------------------------+

따라서 귀하의 일부 코드 또는 라이브러리가 6 바이트 버퍼에 16 바이트를 작성하면 패딩과 2 바이트의 내부 malloc 정보를 덮어 씁니다. 다음에 Malloc을 부를 때는 데이터를 걸어 가서 공간을 찾아, 덮어 쓰기 공간을 쳤으며, 힙을 덮고 힙을 손상시키기 때문에 무의미합니다.

구현에 따라 이러한 오류는 더블 프리를 만들면 발생할 수 있습니다.

다른 팁

아마도 이것은 Malloc 자체에서 문제가되지 않습니다. 오히려 이것은 응용 프로그램이 힙의 부분을 수정하는 데 문제가되지 않아야합니다.

Linux에서 실행중인 경우 사용해보십시오 Valgrind 힙을 버리는 코드를 확인하십시오.

이것의 일반적인 원인은 Malloc ()가 당신에게 쓸 수있는 권한을 부여하지 않은 데이터를 작성했기 때문에 - 버퍼 오버런 (주어진 공간의 끝을 넘어서) 또는 버퍼 언더 런 (버퍼 시작하기 전에 쓰기 ).

때때로 Malloc () et al에 의해 할당되지 않은 포인터를 자유롭게함으로써 발생하거나 Malloc ()에 의해 할당 된 포인터를 다시 풀어 놓음으로써 (이중 자유 링)로 인해 발생할 수 있습니다. 예를 들어, 정적 버퍼를 제거하는 것은 나쁜 생각입니다. 당신은 부패를 얻을 것입니다.

문제가 코드에 있다고 가정해야합니다. Malloc () et al.에서 문제가 될 가능성은 거의 없으며 사용중인 다른 라이브러리에 있지 않을 것입니다.

힙 부패의 일반적인 원인이 몇 가지 있습니다.

  • 메모리 할당 오버런 (할당 된 블록의 끝을지나 쓰기)
  • 블록을 이중 자유롭게합니다
  • 해방 된 후 포인터를 사용합니다
  • 그리고 물론 이전 할당 ( 'RAM 히트'또는 불량 포인터)와 아무 관련이없는 포인터를 통해 잘못 쓰는 것은 위의 모든 것을 포함하는 일반적인 경우입니다.

원인과 결과가 종종 시간과 공간 (코드의 다른 영역)으로 분리되기 때문에 이러한 문제는 디버깅하기가 어려울 수 있습니다. 따라서 문제가 발생한 버그가 발생한 후에 영원 (컴퓨터 시간)이 통과 할 때까지 버그는 눈치 채지 못합니다.

디버그 힙을 사용하면 이러한 문제를 디버깅하는 데 매우 도움이 될 수 있습니다. Microsoft의 컴파일러는 다음에 있습니다 crtdebug 힙 디버그 빌드에서 활성화되어 있지만 추가 구성 항목을 설정할 수 있습니다). GCC가 상자에서 무엇을 가지고 있는지 잘 모르겠지만 통과 할 때 익숙한 도구가 있습니다. Valgrind와 전기 울타리 도움이 될 수 있습니다. 마침내 많은 톤이 있습니다 집에서 자란 힙 디버그 라이브러리 도움이 될 수 있습니다 (Google 주변).

Malloc () 진술서를 제공해 주시겠습니까?

또한 반환 값이 무효가 아닌지 다시 확인하고 싶습니까?

처음에 할당 할 메모리가없는 것 외에는 사용할 때 발생했을 때 발생한 문제 malloc() 또는 new 실제로 손상된 힙의 결과가있는 곳에서 언급 한 자연과 비슷합니다. 나는 일반적으로 프로그램의 다른 곳에서 Memcpy ()와 같은 수정을하는 캐릭터 버퍼와 함께 버퍼 오버런과 엉뚱한 주소 공간을 일으키는 몇 가지 "흥미로운"코드를 발견했습니다.

-BN

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top