2008-11-09 5 views
6

일부 변수에 대한 포인터가 주어졌습니다. 정적 또는 동적 할당 여부를 확인하는 방법이 있습니까 ??무언가가 malloced되었는지 확인

+0

가 무엇 이렇게하는 욕망이 동기 :

Raymond Chen

는 (중심 윈도우, 그러나 개념은 어디서나 동일) 그것에 대해 블로그 게시물을 가지고? – Dan

+0

메신저는 기본적으로 구조체를 없애는 메소드를 만듭니다. 그것은 malloced 일 수도 있고 아닐 수도있는 무언가에 대한 포인터 인 데이터 멤버를 가지고 있습니다. 어느 것에 따라, 그것을 해제하고 싶습니다 –

답변

9

:

메신저는 기본적으로 구조체를 제거하는 방법을. 가 또는 어느 하나에 따라 .. malloc으로 할당되지 않을 수 있습니다 무언가에 대한 포인터는 데이터 멤버를 가지고, 내가 그것을

올바른 방법은 구조체에 또 다른 구성원을 추가하는 것입니다 무료 싶습니다 : 할당 해제 함수에 대한 포인터.

정적 대 동적 할당이 아닙니다. 가능한 할당 자 중 하나가 있으며 malloc()은 하나뿐입니다.

유닉스 계열 시스템에

때문일 수 있습니다 :

  • 스택 할당을 동적
  • 스택에
  • 만에 정적 변수
  • (즉 alloca()) 힙에
  • 할당 함께 malloc()
  • 힙에 할당 된 new
  • 힙에 어레이의 중앙은 할당 mmap
  • 할당 new
  • 할당 객체의 기본 클래스 내의 힙 malloc()
  • 할당 구조체 내의 힙 new[]
  • 할당 여러 조합 및 Windows에서 위의

의 변화를 포함하여 사용자 정의 할당

  • 더 많은 옵션을, 당신은 또한 세비가 ral 런타임, LocalAlloc, GlobalAlloc, HeapAlloc (쉽게 만들 수있는 여러 개의 힙이 있음) 등이 있습니다.

    사용한 할당 자에 대한 올바른 릴리스 기능으로 항상 메모리를 해제해야합니다. 따라서 메모리 할당을 담당하는 프로그램 부분에서 메모리를 해제해야하거나 메모리를 확보 할 코드에 올바른 릴리스 함수 (또는 그 주변의 래퍼)를 전달해야합니다.

    포인터를 항상 특정 할당 자로 할당해야하거나 메모리를 할당하는 함수 및 가능하면 해제 할 함수의 형태로 할당자를 직접 제공하여 전체적인 문제를 피할 수도 있습니다. 할당자를 직접 제공하면 태그가있는 포인터와 같은 트릭을 사용하여 정적 할당도 사용할 수 있습니다 (단,이 방법에 대한 자세한 내용은 여기에 나와 있지 않음). Allocating and freeing memory across module boundaries 호기심에서

  • 0

    malloc 디버거와 마찬가지로 LD_PRELOAD 등을 사용하여 malloc() 자체에 연결할 수 있습니까? 그렇다면 할당 된 모든 포인터의 테이블을 유지하고이를 사용할 수 있습니다. 그렇지 않으면 확실하지 않습니다. malloc의 부기 정보를 얻을 수있는 방법이 있습니까?

    2

    ACE 라이브러리가 여기 저기에 있습니다. 그들이 어떻게하는지 확인할 수 있습니다. 일반적으로 처음에는이 작업을 수행하지 않아도됩니다 ...

    0

    표준 기능으로는 사용되지 않습니다.
    malloc 라이브러리의 디버그 버전에는이를 수행하는 몇 가지 기능이있을 수 있습니다.

    0

    정적 인 것으로 알고있는 주소와 주소를 비교할 수 있습니다. 주소가 멀리 떨어져있을 때만 malloced라고 말할 수 있습니다. 범위를 알 수 있으면 알 수 있지만 범위를 알 수 없다면 실제로는 할 수 없습니다. 그것을 믿어 라.

    2

    힙, 스택 및 정적 데이터 영역은 일반적으로 서로 다른 메모리 범위를 차지하므로 프로세스 메모리 맵에 대한 자세한 지식을 통해 주소를보고 어떤 할당 영역이 있는지 파악할 수 있습니다. 기술은 아키텍처와 컴파일러에 따라 다르므로 코드 포팅을 더 어렵게 만듭니다.

    2

    대부분의 libc malloc 구현은 'magic'값뿐만 아니라 블록 크기에 대한 정보가있는 (free() 호출에서 사용할 필드가있는) 반환 된 각 메모리 블록 앞에 헤더를 저장하여 작동합니다. . 이 마법 값은 사용자가 실수로 alloc'd가 아닌 포인터를 삭제하거나 사용자가 덮어 쓴 블록을 해제하지 못하도록 보호하는 것입니다. 매우 시스템에 특화되어 있기 때문에 당신은 libc 라이브러리의 구현을보고 어떤 마법의 가치가 있었는지 정확하게 알아야합니다.

    일단 당신이 알고 있으면, 주어진 포인터를 헤더를 가리 키도록 이동시킨 다음 마법 값을 확인하십시오.

    0

    1.) u 코드에 대한 맵 파일을 얻습니다.

    2) 기본 프로세스/하드웨어 타겟 플랫폼은 일반적으로 메모리의 시작 주소 (스택, 힙, global0, 해당 블록의 크기, 해당 메모리 블록의 읽기/쓰기 특성)를 나타내는 메모리 맵 파일을 가져야합니다.

    3.) 1. mao 파일에서 개체의 주소 (포인터 변수)를 가져온 후 1) 주소가 속하는 블록을 확인합니다. u는 약간의 아이디어를 얻을지도 모른다. 귀하의 코멘트에서 인용 = AD

    관련 문제