C ++ 문자 배열 [] 메모리 누수 [중복]
나는 char arr []을 생성하고 그것에 문자열 리터럴을 할당
char arr[] = "some string"; // arr occupies 12 chars in memory
std::cout << std::strlen(arr) << std::endl; // lenght is 11 chars + 1 null-terminator
//arr[11] is '\0'
다음으로 널 종료자를 6 요소에 넣습니다.
arr[5] = '\0';
std::cout << std::strlen(arr) << std::endl; // lenght is 5 chars + 1 null-terminator
- 메모리 누수입니까?
- 컴파일러는 첫 번째 '\ 0'이후에 메모리를 해제해야한다는 것을 어떻게 알 수 있습니까? (변수 arr 삭제시기)
- 이 arr 변수의 길이를 변경하고 변수를 삭제할 때 얼마나 비워야하는지 컴파일러에 알릴 수 있습니까?
답변
- 메모리 누수입니까?
아니.
- 컴파일러는 첫 번째 '\ 0'이후에 메모리를 해제해야한다는 것을 어떻게 알 수 있습니까? (변수 arr 삭제시기)
변수는 12 자입니다. 다음과 같이 작성하는 것과 같습니다.
char arr[12] = "some string";
따라서 항상 12자를 해제합니다. 변수 는 12 자의 배열입니다. 6 번째 문자가 '\ 0'이라는 사실은 완전히 관련이 없습니다.
그건 그렇고, 6 번째 문자를 '\ 0'으로 설정하면 여전히 12 문자 배열이기 때문에 12 문자를 모두 사용할 수 있습니다. '\ 0'이후에도. 그러나 13 개의 문자를 저장할 수 없습니다.
- 이 arr 변수의 길이를 변경하고 변수를 삭제할 때 얼마나 비워야하는지 컴파일러에 알릴 수 있습니까?
아니요. 변수의 크기는 변경할 수 없습니다.
이 코드에서 :
char arr[] = "some string";
변수 arr
는 크기가 고정 된 정적 배열입니다. 여기에는 동적 메모리 할당이 없으므로 메모리 누수에 대해 걱정할 필요가 없습니다. 컴파일러는 무엇을 작성하든 상관없이 메모리를 처리 arr
합니다.
완전성을 위해.
다음과 같이 할당 된 메모리에도 메모리 누수가 없습니다.
char* arr = (char*) malloc(12);
strcpy(arr, "some string");
arr[6] = '\0';
free(arr);
메모리 관리는 기본 사용량 (nul-terminated char *)이 아니라 할당 된 메모리 (12)에 의해 수행됩니다. (C 스타일, C ++도 마찬가지)
거꾸로 된 것 같습니다. C ++의 배열 크기는 변경할 수 없습니다. 그 사실과 포인터로 배열을 전달하면 해당 배열 계약 의 실제 크기 정보가 C 스타일 문자열에 대해 생성 되었기 때문에 0 바이트 \0
일명 null 종결자가 문자열의 동적 끝으로 취급됩니다. 동의는 C 스타일 문자열로 작동하는 함수가이를 문자열 종료로 취급 함을 의미합니다. 이를 통해 길이가 다른 문자열에 대해 고정 크기 배열을 사용하고 실제 메모리 크기가없는 하나의 포인터 만 읽을 함수에 전달할 수 있습니다 (예 : 화면으로 인쇄). 데이터를 쓰는 함수에 char 배열을 전달할 때 종종 실제 배열 크기 를 알려야합니다 . 따라서 해당 함수가 이미있는 경우 null 종결자를 무시하므로 함수가 범위를 벗어난 메모리에 액세스하지 않습니다.
이 계약은 어레이가 관리하는 다른 계층에서 발생합니다. 따라서 해당 배열에 넣은 데이터는 언어 관점에서 크기에 영향을 미치지 않습니다. C ++ 컴파일러의 경우 고정 크기 배열을 만든 경우 일부 데이터를 여기에 넣고 수명이 다하면 컴파일러가 전체 고정 크기 배열로 파괴합니다. 거기에 0 바이트를 넣든 그렇지 않든 상관하지 않습니다.
메모리 누수는 프로그래머가 연산자를 사용하여 메모리를 할당했고 또는 new
연산자를 사용하여 삭제하지 않았을 때 발생합니다 .delete
delete []
이 선언에서
char arr[] = "some string";
자동 저장 기간 또는 정적 저장 기간이있는 문자 배열 arr에 대한 컴파일러 (또는 시스템) 할당 메모리입니다. 따라서 컴파일러 (또는 시스템)는 할당 된 메모리를 해제 할 책임이 있습니다. 할당 된 메모리의 주소는 컴파일러 (또는 시스템)에 알려져 있습니다.
이 문장 사용
arr[5] = '\0';
어레이를 재할 당하지 않았습니다. 내용을 더 정확하게 바이트 하나만 변경했습니다.
컴파일러는 첫 번째 '\ 0'이후에 메모리를 해제해야한다는 것을 어떻게 알 수 있습니까? (변수 arr 삭제시기)
컴파일러 (또는 시스템)가 배열 유형의 객체가 선언 된 방법을 알고 있기 때문입니다.
개체에는 12 바이트가 할당되었습니다.
char arr[] = "some string";
이 arr 변수의 길이를 변경하고 변수를 삭제할 때 얼마나 비워야하는지 컴파일러에 알릴 수 있습니까?
나는 당신이 물체의 크기를 의미한다고 생각합니다. 아니요, 개체에 메모리를 할당 한 사람이 사용자가 아니기 때문에 개체의 크기를 변경할 수 없습니다.
new
예를 들어 연산자 를 사용하여 객체를 할당 한 경우 객체를 재 할당 할 수 있습니다.
char *arr = new char[12];
std::strcpy( arr, "some string" );
//...
char *tmp = new char[20];
strcpy( tmp, "another " );
strcat( tmp, arr );
delete [] arr;
arr = tmp;