source

'void*'를 해제해도 괜찮습니까?

lovecheck 2023. 10. 4. 22:01
반응형

'void*'를 해제해도 괜찮습니까?

고려 사항:

struct foo
{
    int a;
    int b;
};

void* p = (void*)malloc(sizeof(struct foo));
((foo*)p)->a; // Do something.
free(p); // Is this safe?

네.

malloc 반품void *프리테이크와 프리테이크void *, 그래서 당신의 캐스팅 중 일부는 무의미하고, 당신은 항상 당신이 자유롭게 하는 것입니다.void *다른 종류의 포인터로 시작한다고 해도 말입니다.

네, 안전합니다.메모리를 할당할 때 런타임 라이브러리는 각 할당의 크기를 추적합니다.free()를 호출하면 해당 주소가 검색되고 해당 주소에 대한 할당을 찾으면 올바른 양의 메모리(해당 주소에 할당된 블록)가 해제됩니다.

예 --free를 호출하면 포인터가 ( implicit으로) 포인터로 캐스팅되어 어떤 경우에도 포인터가 무효가 됩니다.

나머지 코드는 안전하지 않습니다.

void* p = (void*)malloc(sizeof(foo));

malloc(C)에서 반환을 캐스트해서는 안 됩니다.이것은 잊어버린 실수를 덮어줄 수 있습니다.#include <stdlib.h>

네. 그 기능 프로토타입은free는 짝수:

void free(void *ptr);

C에서는 전화할 파괴자가 없기 때문에 완벽하게 안전합니다.

메모리 시스템은 할당의 크기를 추적합니다.

C++에서는 새로운 유형을 삭제해야 합니다. 여기에는delete[]연산자가 새 배열을 삭제합니다.

이것은 단지 파괴자들을 불러내기 위한 것입니다.

아마도 무대 뒤에서 일어나는 마법 때문에 안전하지 않은 것 같습니다.C 런타임 및/또는 OS 자체가 malloc에 의해 반환되는 메모리를 크기 및 위치를 포함하여 능동적으로 추적하고 있습니다.입력할 수 없는 포인터를 free()로 다시 전달하는 것처럼 느껴지지만 실제로 메모리 관리자가 능동적으로 추적하는 개체에 대한 참조를 다시 전달하는 것입니다.

네 안전합니다.

네, 하지만 보통은 디자인이 좋지 않다는 신호입니다.

malloc ()는 일반적으로 버퍼(같은 프리미티브 타입의 큰 배열)나 객체(필드가 초기화된 struct)를 할당하는 데 사용됩니다.두 경우 모두 malloc과 free가 일치해야 하므로,

  unsigned char *rgba_buffer = malloc(width * height * 4);
  /* Use the buffer here */
  free(rgba_buffer);

  BITSTREAM *bs = bitstream("bitfile.boin");
  /* Use the bitstream here */
  destroy_bitstream(bs);

  typedef struct
  {
     FILE *fp;
     unsigned char ch;
     int index;
  } BITSTREAM;


  BITSTREAM *bitstream(const char *filename)
  {
      BITSTREAM *bs = malloc(sizeof(BITSTREAM));
      bs->fp = fopen(filename "rb");
      /* etc */
      return bs;
  }

  void destroybitstream(BITSTREAM *bs)
  {
     if(bs)
     {
        if(bs->fp)
          fclose(bs->fp);
        free(bs);
     }
  }

한 경우는 malloc과 free match이고, 다른 경우는 할당된 메모리가 반환됩니다.보조 리소스도 있으며 생성자와 소멸자가 일치합니다.메모리 영역을 할당하는 경우는 드물지만 메모리 영역이 무엇에 사용되는지는 알 수 없습니다.그리고 당신은 할당된 것들을 뒤섞어서 자유롭게 놔두어서는 안됩니다.

현대의 C++는 객체를 "소유"하는 독특한 포인터로 이 모든 것을 조입니다.고유한 공백 포인터를 가질 수는 있지만 매우 드물 것입니다.

언급URL : https://stackoverflow.com/questions/2182103/is-it-ok-to-free-void

반응형