이해에서의 메모리 누수는 C/C++[마감]
-
29-09-2020 - |
문제
내가 찾던에서 여기 예를 들어:https://blog.parasoft.com/finding-memory-leaks-in-c
#include <stdlib.h>
#include <string.h>
int main(int argc, char *argv[]) {
char *string, *string_so_far;
int i, length; length = 0;
for(i=0; i<argc; i++) {
length += strlen(argv[i])+1;
string = malloc(length+1);
/* * Copy the string built so far. */
if(string_so_far != (char *)0)
strcpy(string, string_so_far);
else *string = '\0';
strcat(string, argv[i]);
if(i < argc-1) strcat(string, " ");
string_so_far = string;
}
printf("You entered: %s\n", string_so_far);
return (0);
}
읽을 때 우리는 실행하는 프로그램과 함께 인수는 다음과 같습니다.
hello this is a test
변수 string_so_far 포인트는 문자열"hello"된 결과적으로 이전 루프 반복.그러나 내가 이해하지 못하는 방법?단계별 설명은 것이 정말로 도움이됩니다.
둘째,이 예제에서는 물론 재료:
int countPrimes(int n)
{
PrimeSet *p = new PrimeSet(n);
return( p->countPrimeNumbers() );
}
그것은 언급이 있다는 메모리 누수가 여기서 그러나 나는"t 는 정말 이해가 얼마나 아마 때문에,나는 확실하지 않 여기에 무슨 일이 일어나고 있는지.
해결책
첫번째 예에서,당신은 사용 malloc
루프 안에 있습니다.이 malloc
전화 예약 블록의 메모리고 반환합니다 차단의 첫번째 주소입니다.당신을 삭제해야하는 블록 free
당신이 더 이상 필요가 없습니다.는 경우 프로그래머 소원을 메모리를 확장 블록,더 나은 대안이 될 것입 realloc
.에 대한 자세한 realloc
에 http://www.cplusplus.com/reference/cstdlib/realloc/.
에서 당신의 두 번째 예체에서 포인터 p
포인트가 초기화되는 힙에 남아 있을 것 이 숙박 시설에 힙 때까지 사용하여 프로그래머 delete
.에 더 안전한 대안을 만들기 위한 객체를 힙에는 그것을 만드는 스택에서 제거하는 모든 데이터는 후에는 메소드의 호출이 완료됩니다.
int countPrimes(int n){
PrimeSet p(n);
return( p.countPrimeNumbers() );
}
는 경우 메모리 관리는 적절하지 않은 같은 두 번째 예에서 객체지 않을 삭제한 후에만 참조하여 분실,따라서 메모리 누수가 발생합니다.
다른 팁
두 번째 예에서는 Primeset 객체의 공간을 할당하고이를 초기화 한 다음 CountPrimEnumbers 함수를 호출합니다.Primeset 객체는 여전히 존재합니다. 여전히 메모리를 차지하고 더 많은 메모리를 할당했을 것입니다. 그리고 모든 메모리는 여전히 점유되었지만 액세스 할 수 없습니다.그것이 메모리 누수입니다 : 점령되지만 사용할 수없는 메모리입니다.