'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
'source' 카테고리의 다른 글
도커 - 호스트 USB 또는 직렬 장치에 액세스할 수 있는 방법? (0) | 2023.10.04 |
---|---|
팬더 데이터 프레임의 첫 몇 줄을 읽는 방법 (0) | 2023.10.04 |
Linux에서 WaitForSingleObject 및 WaitForMultipleObjects equivalent? (0) | 2023.10.04 |
Office 365용 VSTO 추가 기능 (0) | 2023.10.04 |
Angularjs - 본문 요소 내부 지시어 가져오기 (0) | 2023.10.04 |