I는 C++에서 다음 함수가 호출 func1()
메모리 누출의 C/메모리 할당 ++
void func1()
{
char *p = "Test for memory leak";
}
어디 변수의 메모리가 할당되어있다? 스택이든 힙이든간에?
delete p;
을 명시 적으로 호출해야합니까?
I는 C++에서 다음 함수가 호출 func1()
메모리 누출의 C/메모리 할당 ++
void func1()
{
char *p = "Test for memory leak";
}
어디 변수의 메모리가 할당되어있다? 스택이든 힙이든간에?
delete p;
을 명시 적으로 호출해야합니까?
아니요, 메모리는 스택의 포인터 p
에 대해서만 할당됩니다. 이 메모리는 p
이 범위를 벗어날 때 자동으로 교정됩니다. p
은 프로그램의 읽기 전용 섹션에 저장되는 문자열을 가리키고 있습니다. 이상적으로 그것은 const char *p
으로 정의되어야합니다. delete
시도하면 정의되지 않은 동작이됩니다. 일반적으로 new
에 대한 모든 호출에 대해 delete
문자열 리터럴 용 메모리는 정적 저장소에 할당되며 할당 기간은 전체 프로그램 실행 시간입니다. delete를 호출하면 정의되지 않은 동작이 발생합니다.
의 호출이 필요하다는 것을 기억할 수 있습니다. 문자열 리터럴은 일반적으로 실행 파일의 읽기 전용 텍스트 세그먼트에 있습니다. 그 (것)들에 자유롭거나 삭제하는 것은 나쁜 것으로 아마 이끌어 낼 것입니다.
메모리 누수가 전혀 없습니다. 컴파일 된 코드를 보면 문자열 Test for memory leak\0
은 실제로 실행 프로그램의 일부입니다. 그리고 로더는 실행 중에이 코드를 메모리로 복사합니다. 운영 체제는 프로그램 종료시이 미리로드 된 메모리를 지 웁니다.
변수 *p
자체는 함수가 호출 될 때 스택에 할당되며 함수가 반환하면 포인터는 스택에서 제거됩니다.
delete
은 new
(힙에서 가져온 메모리에만 해당)을 사용하여 할당 된 메모리를 호출해야합니다.
새로운 [] 연산자는 C++에서 힙에 메모리를 명시 적으로 할당하는 데 사용됩니다.
규칙마다 new
오퍼레이터
1. 통화 delete
되어 사용되는 모든 new[]
오퍼레이터
2 delete[]
호를 이용했다.
나머지는 모두 스택에 저장되며 명시 적으로 할당을 해제해서는 안됩니다. 자동으로 처리됩니다.
이 규칙을 따르면 잘못 될 수 없습니다.
새 루프를 사용하고 외부에서 삭제를 사용하는 경우주의하십시오. 큰 메모리 누수가 발생합니다.
가장 좋은 방법은 포인터가 범위를 벗어날 때 자동으로 메모리 할당을 해제하는 스마트 포인터를 사용하는 것입니다. Boost 라이브러리는 동일한 옵션을 제공합니다. 여기에 더 읽기 : http://www.boost.org/doc/libs/1_41_0/libs/smart_ptr/smart_ptr.htm
--Samrat 파틸
기능은 정적으로 할당 된 문자열"Test for memory leak"
를 가리 키도록 설정되어 포인터
p
를 정의
합니다.
아무 것도 동적으로 할당되지 않으므로 수동으로 해제 할 필요가 없습니다.
항상 전화를 new
과 delete
으로 페어링해야합니다. 무언가가 new
'일 때 deleted
이어야하고, 그 반대도 마찬가지입니다.
귀하의 경우 문자열 자체는 정적이며 프로그램이 종료 될 때까지 지속됩니다. p
은 스택의 로컬 변수이며 함수가 반환 될 때까지 지속됩니다.
이 두 가지 모두 시스템에서 자동으로 처리합니다.
누수가 있는지 정확하게 알기 위해 디버거를 사용할 수 있습니다. 나는 deleaker를 사용하고 싶다. 그것으로 누출이 어느 시점에 있는지 알 수 있습니다. 누설이 제거하기 쉬운 곳을 아십시오.
+1'char const * p' - 포인터를 읽기 전용으로 강제하는 것은 포인터의 의도를 반영하여 읽기 전용이되는 좋은 동작입니다. –
.. * 기침 * 나는 포인터가 읽기 전용 메모리를 가리킨다는 것을 의미합니다. 포인터 자체는 일정하지 않습니다. –