문제

내가 찾던에서 여기 예를 들어: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.에 대한 자세한 reallochttp://www.cplusplus.com/reference/cstdlib/realloc/.

에서 당신의 두 번째 예체에서 포인터 p 포인트가 초기화되는 힙에 남아 있을 것 이 숙박 시설에 힙 때까지 사용하여 프로그래머 delete.에 더 안전한 대안을 만들기 위한 객체를 힙에는 그것을 만드는 스택에서 제거하는 모든 데이터는 후에는 메소드의 호출이 완료됩니다.

int countPrimes(int n){
   PrimeSet p(n);
   return( p.countPrimeNumbers() );
}

는 경우 메모리 관리는 적절하지 않은 같은 두 번째 예에서 객체지 않을 삭제한 후에만 참조하여 분실,따라서 메모리 누수가 발생합니다.

다른 팁

두 번째 예에서는 Primeset 객체의 공간을 할당하고이를 초기화 한 다음 CountPrimEnumbers 함수를 호출합니다.Primeset 객체는 여전히 존재합니다. 여전히 메모리를 차지하고 더 많은 메모리를 할당했을 것입니다. 그리고 모든 메모리는 여전히 점유되었지만 액세스 할 수 없습니다.그것이 메모리 누수입니다 : 점령되지만 사용할 수없는 메모리입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 cs.stackexchange
scroll top