2009-11-30 6 views
3

I는 C++에서 다음 함수가 호출 func1() 메모리 누출의 C/메모리 할당 ++

void func1() 
{ 
    char *p = "Test for memory leak"; 
} 

어디 변수의 메모리가 할당되어있다? 스택이든 힙이든간에? delete p;을 명시 적으로 호출해야합니까?

답변

10

아니요, 메모리는 스택의 포인터 p에 대해서만 할당됩니다. 이 메모리는 p이 범위를 벗어날 때 자동으로 교정됩니다. p은 프로그램의 읽기 전용 섹션에 저장되는 문자열을 가리키고 있습니다. 이상적으로 그것은 const char *p으로 정의되어야합니다. delete 시도하면 정의되지 않은 동작이됩니다. 일반적으로 new에 대한 모든 호출에 대해 delete

+5

+1'char const * p' - 포인터를 읽기 전용으로 강제하는 것은 포인터의 의도를 반영하여 읽기 전용이되는 좋은 동작입니다. –

+0

.. * 기침 * 나는 포인터가 읽기 전용 메모리를 가리킨다는 것을 의미합니다. 포인터 자체는 일정하지 않습니다. –

15

문자열 리터럴 용 메모리는 정적 저장소에 할당되며 할당 기간은 전체 프로그램 실행 시간입니다. delete를 호출하면 정의되지 않은 동작이 발생합니다.

0

의 호출이 필요하다는 것을 기억할 수 있습니다. 문자열 리터럴은 일반적으로 실행 파일의 읽기 전용 텍스트 세그먼트에 있습니다. 그 (것)들에 자유롭거나 삭제하는 것은 나쁜 것으로 아마 이끌어 낼 것입니다.

1

메모리 누수가 전혀 없습니다. 컴파일 된 코드를 보면 문자열 Test for memory leak\0은 실제로 실행 프로그램의 일부입니다. 그리고 로더는 실행 중에이 코드를 메모리로 복사합니다. 운영 체제는 프로그램 종료시이 미리로드 된 메모리를 지 웁니다.

변수 *p 자체는 함수가 호출 될 때 스택에 할당되며 함수가 반환하면 포인터는 스택에서 제거됩니다.

0

deletenew (힙에서 가져온 메모리에만 해당)을 사용하여 할당 된 메모리를 호출해야합니다.

4

새로운 [] 연산자는 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를 정의
1

합니다.

아무 것도 동적으로 할당되지 않으므로 수동으로 해제 할 필요가 없습니다.

항상 전화를 newdelete으로 페어링해야합니다. 무언가가 new '일 때 deleted이어야하고, 그 반대도 마찬가지입니다.

귀하의 경우 문자열 자체는 정적이며 프로그램이 종료 될 때까지 지속됩니다. p은 스택의 로컬 변수이며 함수가 반환 될 때까지 지속됩니다.

이 두 가지 모두 시스템에서 자동으로 처리합니다.

2

누수가 있는지 정확하게 알기 위해 디버거를 사용할 수 있습니다. 나는 deleaker를 사용하고 싶다. 그것으로 누출이 어느 시점에 있는지 알 수 있습니다. 누설이 제거하기 쉬운 곳을 아십시오.