매달린 포인터와 메모리 누수의 차이를 이해하지 못합니다. 이 두 용어는 어떤 관련이 있습니까?
답변
매달려 포인터가 이미 해제 된 메모리에 포인트. 스토리지가 더 이상 할당되지 않습니다. 액세스를 시도하면 분할 오류가 발생할 수 있습니다.
매달린 포인터로 끝나는 일반적인 방법 :
char *func()
{
char str[10];
strcpy(str, "Hello!");
return str;
}
//returned pointer points to str which has gone out of scope.
호출 함수로 컨트롤이 반환 된 시간에 의해 범위를 벗어난 지역 변수 인 주소를 반환합니다. (정의되지 않은 동작)
또 다른 일반적인 매달려 포인터 예는 해당 메모리에서 free가 명시 적으로 호출 된 후 포인터를 통해 메모리 위치에 액세스하는 것입니다 .
int *c = malloc(sizeof(int));
free(c);
*c = 3; //writing to freed location!
메모리 누수가 그것을 얻을 수있는 어떤 방법이 더 이상 존재하지으로, 이제 (그것을 해제 또는) 해제되지 않은 메모리를 액세스 할 수있는 방법이 없습니다. (예 : 동적으로 할당 된 (해제되지 않은) 메모리 위치 에 대한 유일한 참조 였으며 현재 다른 곳을 가리키는 포인터입니다.)
void func(){
char *ch = malloc(10);
}
//ch not valid outside, no way to access malloc-ed memory
Char-ptr ch는 함수의 끝에서 범위를 벗어나 동적으로 할당 된 10 바이트를 유출하는 지역 변수입니다 .
답변
이것들은 서로의 반대라고 생각할 수 있습니다.
메모리 영역을 해제했지만 여전히 포인터를 유지하면 해당 포인터가 매달려 있습니다.
char *c = malloc(16);
free(c);
c[1] = 'a'; //invalid access through dangling pointer!
포인터를 잃었지만 할당 된 메모리를 유지하면 메모리 누수가 발생합니다.
void myfunc()
{
char *c = malloc(16);
} //after myfunc returns, the the memory pointed to by c is not freed: leak!
답변
매달려 포인터가 예상 개체의 유형에 대해 유효하지 않은 일부 메모리를 참조하는 값 (하지 NULL)가 하나입니다. 예를 들어 객체에 대한 포인터를 설정 한 다음 관련없는 다른 것으로 해당 메모리를 덮어 쓰거나 동적으로 할당 된 경우 메모리를 해제합니다.
메모리 누수가 동적으로 힙에서 메모리를 할당하지만 결코 당신이 그것에 대한 모든 참조를 손실 가능성이 있기 때문에, 그것을 해제 할 때입니다.
둘 다 잘못 관리 된 포인터, 특히 동적으로 할당 된 메모리와 관련된 상황이라는 점에서 관련됩니다. 한 상황에서 (댕글 링 포인터) 메모리를 해제했지만 나중에 참조하려고했습니다. 다른 하나 (메모리 누수)에서는 메모리를 완전히 해제하는 것을 잊었습니다!
답변
댕글 링 포인터
어떤 포인터가 변수의 메모리 주소를 가리키고 있지만 포인터가 여전히 그러한 메모리 위치를 가리키고있는 동안 일부 변수가 해당 메모리 위치에서 삭제 된 후. 이러한 포인터를 댕글 링 포인터 라고하며이 문제를 댕글 링 포인터 문제라고합니다.
#include<stdio.h>
int *call();
void main(){
int *ptr;
ptr=call();
fflush(stdin);
printf("%d",*ptr);
}
int * call(){
int x=25;
++x;
return &x;
}
출력 : 가비지 값
참고 : 일부 컴파일러에서는 로컬 변수 또는 임시 주소의 주소를 반환하는 경고 메시지가 표시 될 수 있습니다.
설명 : 변수 x는 지역 변수입니다. 범위와 수명은 함수 호출 내에 있으므로 x 변수 x의 주소를 반환 한 후 죽고 포인터는 여전히 ptr을 가리키고 있습니다.
이 문제의 해결책 : 변수 x를 정적 변수로 만드십시오. 즉, 포인팅 객체가 삭제 된 포인터를 댕글 링 포인터라고 할 수 있습니다.
메모리 누수
컴퓨터 과학에서 메모리 누수는 컴퓨터 프로그램이 메모리 할당을 잘못 관리 할 때 발생합니다. 간단하게 우리는 메모리를 할당하고 Free 다른 언어 용어는 메모리 누수를 호출하지 않고 응용 프로그램과 예기치 않은 충돌에 치명적이라고 말합니다.
답변
포인터는 동적 변수라고하는 변수에 대한 사용자 정의 범위를 만드는 데 도움이됩니다. 동적 변수는 단일 변수 또는 동일한 유형 array
의 변수 그룹 ( ) 또는 다른 유형의 변수 그룹 ( struct
) 일 수 있습니다. 기본 지역 변수 범위는 제어가 함수에 들어갈 때 시작되고 제어가 해당 함수에서 나올 때 끝납니다. 기본 전역 가변 범위는 프로그램 실행시 시작되고 프로그램이 완료되면 종료됩니다.
그러나 포인터에 의해 유지되는 동적 변수의 범위는 프로그래머가 결정해야하는 프로그램 실행의 어느 지점에서나 시작하고 끝날 수 있습니다. 댕글 링과 메모리 누수는 프로그래머가 범위의 끝을 처리하지 않는 경우에만 발생합니다.
프로그래머 free
가 동적 변수의 범위 끝 코드 ( 포인터)를 작성하지 않으면 메모리 누수가 발생 합니다. 어떤 식 으로든 프로그램이 완전한 프로세스 메모리를 종료하면이 누수 된 메모리도 해제됩니다. 그러나 오랜 시간 동안 실행되는 프로세스에는 매우 심각한 문제가 발생합니다.
동적 변수의 범위가 종료 (해제)되면 NULL
포인터 변수에 할당되어야합니다. 그렇지 않으면 코드가 잘못 액세스하면 정의되지 않은 동작이 발생합니다. 따라서 매달린 포인터는 범위가 이미 완료된 동적 변수를 가리키는 포인터 일뿐입니다.
답변
메모리 누수 : 힙에 메모리 영역이 있지만 스택에 해당 메모리를 가리키는 변수가없는 경우.
char *myarea=(char *)malloc(10);
char *newarea=(char *)malloc(10);
myarea=newarea;
댕글 링 포인터 : 스택에는 포인터 변수이지만 힙에는 메모리가 없을 때.
char *p =NULL;
공간을 할당하지 않고 역 참조를 시도하는 댕글 링 포인터는 분할 오류가 발생합니다.
답변
삭제 (또는 해제) 된 메모리 위치를 가리키는 포인터를 댕글 링 포인터라고합니다.
#include <stdlib.h>
#include <stdio.h>
void main()
{
int *ptr = (int *)malloc(sizeof(int));
// After below free call, ptr becomes a
// dangling pointer
free(ptr);
}
자세한 내용은 여기를 클릭하십시오.