C- Free () 함수를 사용하지 않는 무료 동적으로 할당 된 메모리를 자유롭게 할 수있는 대안적인 방법이 있습니까?

StackOverflow https://stackoverflow.com/questions/750060

  •  09-09-2019
  •  | 
  •  

문제

나는 시험을 위해 공부하고 있으며, 이들 중 하나가 무료 (PTR)와 동등한 지 궁금합니다.

 malloc(NULL); 

 calloc(ptr); 

 realloc(NULL, ptr); 

 calloc(ptr, 0); 

 realloc(ptr, 0);

내가 이해 한 바에 따르면, Free () 함수는 실제로 C에게 PTR 이후 메모리가 다시 사용할 수 있다고 말하기 때문에이 중 어느 것도 작동하지 않습니다. 이것은 일종의 멍청한 질문이지만 도움이 될 것입니다.

도움이 되었습니까?

해결책

사실, 마지막은 free(). 사양을 읽으십시오 realloc() 매우 신중하게 데이터를 할당하거나 할당 크기를 변경할 수 있습니다 (특히 새 크기가 이전보다 큰 경우 데이터를 이동할 수 있음). 메모리도 해제 할 수 있습니다. 사실, 당신은 다른 기능이 필요하지 않습니다. 그것들은 모두 측면에서 작성 될 수 있습니다 realloc(). 그들의 올바른 마음 속에있는 사람이 그렇게 할 것입니다 ... 그러나 그것은 할 수 있습니다.

Steve Maguire 's를 참조하십시오.견고한 코드 작성"의 위험에 대한 완전한 해부를 위해 malloc() 기능의 가족. 참조 accu "솔리드 코드 작성"을 읽는 위험에 대한 완전한 해부를위한 웹 사이트. 나는 리뷰가 그것을 만들어내는 것만 큼 나쁘다는 것을 확신하지 못한다. const C89가 여전히 새롭고 광범위하게 구현되지 않은 90 년대 초반으로 돌아갑니다).


D McKee의 MacOS X 10.5 (BSD)에 대한 메모는 흥미 롭습니다 ...

C99 표준은 다음과 같이 말합니다.

7.20.3.3 malloc 함수

개요

#include <stdlib.h>
void *malloc(size_t size);

설명

malloc 함수는 크기가 크기별로 지정되고 값이 불확실한 객체에 대한 공간을 할당합니다.

보고

malloc 함수는 널 포인터 또는 할당 된 공간에 대한 포인터를 반환합니다.

7.20.3.4 부동산 함수

개요

#include <stdlib.h>
void *realloc(void *ptr, size_t size);

설명

REALLOC 함수는 PTR에 의해 가리키는 오래된 객체를 처리하고 크기로 지정된 크기를 가진 새 개체에 대한 포인터를 반환합니다. 새로운 객체의 내용은 거래 전의 기존 물체의 내용과 동일해야하며, 새로운 크기와 기존 크기의 적은 수준까지까지. 오래된 물체의 크기를 넘어서 새로운 객체의 모든 바이트는 불확실한 값을 가지고 있습니다.

PTR이 Null 포인터 인 경우 Realoc 함수는 지정된 크기의 Malloc 함수처럼 동작합니다. 그렇지 않으면, PTR이 이전에 Calloc, Malloc 또는 Realloc 함수에 의해 반환 된 포인터와 일치하지 않으면 또는 무료 또는 재 할당 함수에 대한 호출로 공간이 처리 된 경우 동작이 정의되지 않습니다. 새 개체에 대한 메모리를 할당 할 수없는 경우 이전 객체가 처리되지 않고 그 값이 변경되지 않습니다.

보고

REALLOC 함수는 새 객체 (기존 객체와의 포인터와 동일한 값을 가질 수 있음) 또는 새 개체를 할당 할 수없는 경우 널 포인터에 대한 포인터를 반환합니다.


추가 헤더 및 기능으로 인해 편집 변경과는 별도로 ISO/IEC 9899 : 2011 표준은 C99와 동일하지만 7.20.3 대신 7.22.3 절에서는 동일합니다.


Realloc의 Solaris 10 (SPARC) 맨 페이지는 말합니다.

realloc () 함수는 블록 포인터의 크기를 PTR로 크기로 바이트로 변경하고 (이동할 수있는) 블록에 대한 포인터를 반환합니다. 내용은 신규 및 기존 크기의 적은 수준까지 변경되지 않습니다. 블록의 새로운 크기에 블록의 움직임이 필요한 경우, 블록의 이전 인스턴스화를위한 공간이 제출됩니다. 새 크기가 더 크면 블록의 새로 할당 된 부분의 내용은 지정되지 않습니다. PTR이 null이면 Realloc ()가 지정된 크기에 대해 malloc ()처럼 동작합니다. 크기가 0이고 PTR이 널 포인터가 아닌 경우, 가리키는 공간이 해제됩니다.

그것은 매우 명백한 '그것이 Free ()'문처럼 작동합니다.

그러나 MacOS X 10.5 또는 BSD는 다른 말이 내 첫 단락의 "올바른 마음에 아무도 없다"고 재확인합니다.


물론 C99 이론적 근거... 그것은 말한다 :

7.20.3 메모리 관리 기능

이러한 기능의 정의에서 NULL 포인터 및 제로 길이 할당 요청의 처리는이 패러다임을 뒷받침하려는 욕구에 의해 부분적으로 이어졌습니다.

OBJ * p; // pointer to a variable list of OBJs
    /* initial allocation */
p = (OBJ *) calloc(0, sizeof(OBJ));
     /* ... */
     /* reallocations until size settles */
 while(1) {
    p = (OBJ *) realloc((void *)p, c * sizeof(OBJ));
         /* change value of c or break out of loop */
 }

위원회가 반드시 승인 할 필요는없는이 코딩 스타일은 널리 사용되는 것으로보고되었습니다.

일부 구현은 제로 바이트의 할당 요청에 대해 널이 아닌 값을 반환했습니다. 이 전략은“아무것도 없음”과“제로”(할당되지 않은 포인터 대 제로 길이 공간에 대한 포인터)를 구별 할 수 있다는 이론적 이점이 있지만, 제로 길이의 개념을 요구하는 더 강력한 이론적 단점이 있습니다. 그러한 객체는 선언 될 수 없기 때문에, 그들이 존재할 수있는 유일한 방법은 그러한 할당 요청을 통한 것입니다.

C89위원회는 제로 길이의 물체에 대한 아이디어를 받아들이지 않기로 결정했습니다. 따라서 할당 함수는 제로 바이트의 할당 요청에 대해 널 포인터를 반환 할 수 있습니다. 이 처리는 위에서 설명한 패러다임을 배제하지 않습니다.

C89의 조용한 변화

비 널 포인터를 반환하는 Size-Zero 할당 요청에 의존하는 프로그램은 다르게 행동합니다.

[...]

7.20.3.4 부동산 함수

널 첫 번째 인수는 허용됩니다. 첫 번째 인수가 널이 아니고 두 번째 인수가 0이라면, 호출은 첫 번째 인수에 의해 기억이 지적 된 메모리를 해방시키고 널 인수가 반환 될 수 있습니다. C99는 제로 크기의 객체를 허용하지 않는 정책과 일치합니다.

C99의 새로운 기능 : 부동산 함수는 뾰족한 객체가 거래되고 새 객체가 할당되며 새 객체의 내용은 두 가지 크기의 작은 객체까지 이전 객체의 내용과 동일하다는 것을 분명히하기 위해 변경되었습니다. C89는 새 객체가 이전 객체와 동일한 개체 였지만 다른 주소를 가질 수 있음을 지정하려고 시도했습니다. 이것은 물체의 주소가 일생 동안 일정하다고 가정하는 표준의 다른 부분과 충돌합니다. 또한 크기가 0 인 경우 실제 할당을 지원하는 구현 이이 경우에 널 포인터를 반드시 반환 할 필요는 없습니다. C89는 널 리턴 값을 요구하는 것처럼 보였고,위원회는 이것이 너무 제한적이라고 생각했습니다.


Thomas Padron-McCarthy 관찰:

C89는 명시 적으로 말합니다. "크기가 0이고 PTR이 널 포인터가 아닌 경우 가리키는 객체가 해제됩니다." 그래서 그들은 C99에서 그 문장을 제거한 것 같습니다.

그렇습니다. 그들은 문장이 개막 문장에 의해 포함되어 있기 때문에 그 문장을 제거했습니다.

Realoc 함수는 PTR에 의해 가리키는 오래된 물체를 처리합니다.

거기에는 칙칙한 방이 없습니다. 오래된 개체가 처리됩니다. 요청 된 크기가 0이면 무엇이든 되돌아갑니다. malloc(0) 종종 (보통) 널 포인터이지만 반환 할 수있는 비 널 포인터 일 수 있습니다. free() 그러나 합법적으로 부정 할 수는 없습니다.

다른 팁

realloc(ptr, 0);

동일합니다 free(ptr); (그와 같이 사용하는 것을 권장하지는 않지만!)

또한 :이 두 통화는 서로 동일하지만 (자유롭지는 않지만) :

realloc(NULL,size)
malloc(size)

마지막 하나--realloc(ptr, 0)-가까이. 할당 된 블록을 제거하고 최소한의 할당으로 바꿀 것입니다 (Mac OS X 10.5 Manpage는 말). 시스템에서 무엇을하는지 확인하려면 로컬 맨 페이지를 확인하십시오.

즉, 만약입니다 ptr 실질적인 대상을 가리키면 대부분의 기억이 되돌아 갈 것입니다.


데비안 레니의 남자 페이지가 동의합니다 미치 그리고 홍옥... BSD가 실제로 Linux에서 분기됩니까?


문제가되는 사람 페이지에서 :

REALLOC () 함수는 PTR에 의해 지적 된 할당의 크기를 크기로 변경하고 PTR을 반환하려고합니다. [...] 크기가 0이고 PTR이 NULL이 아닌 경우 새롭고 최소 크기의 물체가 할당되고 원래 객체가 해제됩니다.


Linux 및 Solaris Man 페이지는 매우 깨끗하고 '89 표준 : realloc(ptr,0) 작동합니다 free(ptr). 위의 Mac OS Manpage와 Jonathan이 인용 한 표준은 명확하지 않지만 동등성을 깨뜨릴 공간을 떠나는 것처럼 보입니다.

나는 궁금했다 차이점 : "자유로운 행동"해석은 나에게 매우 자연스럽게 보입니다. 내가 포함 할 수있는 두 구현 모두 약간 환경 변수 중심의 시동성이지만 BSD 버전은 더 많은 옵션을 수용합니다.

 MallocGuardEdges             If set, add a guard page before and after
                              each large block.  
 MallocDoNotProtectPrelude    If set, do not add a guard page before large
                              blocks, even if the MallocGuardEdges envi-
                              ronment variable is set.

 MallocDoNotProtectPostlude   If set, do not add a guard page after large
                              blocks, even if the MallocGuardEdges envi-
                              ronment variable is set.

그리고

 MallocPreScribble            If set, fill memory that has been allocated
                              with 0xaa bytes.  This increases the likeli-
                              hood that a program making assumptions about
                              the contents of freshly allocated memory
                              will fail.
 MallocScribble               If set, fill memory that has been deallo-
                              cated with 0x55 bytes.  This increases the
                              likelihood that a program will fail due to
                              accessing memory that is no longer allo-
                              cated.

아마도 "최소 크기의 객체"는 아무것도 아닙니다 (즉, free) 일반 모드에서는 있지만 무엇 경비원들과 함께. 가치가있는 것에 대해 가져 가십시오.

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