getenv()에서 반환된 char*를 해제/삭제해야 합니까?
char * val;
val = getenv("ENV_VAR_NAME");
위는 환경 변수를 얻기 위한 코드입니다. getenv(char*)에서 반환된 메모리를 확보하지 않으면 메모리 누수가 발생할까요? 만약 그렇지 않다면 그 이유를 대답해주세요.
아니, 넌 그래선 안된다.표준 7.20.4.5는 다음과 같이 말합니다.
getenv 함수는 일치하는 목록 멤버와 연관된 문자열에 포인터를 반환합니다.가리키는 문자열은 프로그램에 의해 수정되지 않아야 하며, getenv 함수에 대한 후속 호출에 의해 덮어쓸 수 있습니다.
삭제는 굵은 글씨로 본문에 가려져 있다고 생각합니다.
당신은 그것을 자유롭게 해서는 안됩니다.다음은 맨 페이지의 일부분입니다.
일반적으로 구현된 것처럼 getenv()는 환경 목록 내의 문자열에 포인터를 반환합니다.호출자는 이 문자열을 수정하지 않도록 주의해야 합니다. 그러면 프로세스 환경이 변경되기 때문입니다.
손대지 마!
아뇨, 창고를 통제할 순 없어요일반적으로 여러 번 재사용되는 정적 배열의 포인터입니다.따라서 나중에 사용하기 위해 저장할 계획인 경우 복사해야 합니다(이 복사본이 올바르게 사용되었는지 확인해야 합니다).
설명서에 명시적으로 포인터를 놓아도 된다고 명시되어 있지 않은 한, 그렇게 해서는 안 됩니다.
삭제하시면 안 됩니다.getenv는 모든 환경 변수를 포함하는 char* 배열(char** environment, 내 기억이 맞다면 char** environment)에서 값을 가져옵니다.삭제하면 정의되지 않은 동작이 발생합니다.
아마도 가장 좋은 이유는 표준이 당신이 할 수 있다고 말하지 않기 때문일 것입니다.함수가 포인터를 반환한다고 해서 포인터가 다음으로 전달되는 것이 유효한 것은 아닙니다.free. 함수의 문서에 함수가 "호출에 의해" 메모리를 할당한다고 명시되어 있지 않다면,malloc" 해당 메모리에 포인터를 반환합니다. 포인터가 유효하지 않다고 가정해야 합니다.realloc아니면free.
언급URL : https://stackoverflow.com/questions/4237812/should-i-free-delete-char-returned-by-getenv
'programing' 카테고리의 다른 글
| 약간 뒤죽박죽: 어떤 비트가 설정되어 있습니까? (0) | 2023.09.12 |
|---|---|
| mysql의 데이터베이스에서 덤프 파일 생성 (0) | 2023.09.12 |
| 특별한 조건으로 그룹화하는 방법 (0) | 2023.09.12 |
| ORM 마이그레이션을 입력합니다.불필요한 쿼리 생성을 중지하는 방법 (0) | 2023.09.12 |
| 워드프레스(프론트엔드)의 대시 아이콘이 표시되지 않음 (0) | 2023.09.12 |