programing

행잉 포인터와 메모리 누수의 차이

sourcejob 2022. 12. 24. 17:41
반응형

행잉 포인터와 메모리 누수의 차이

매달린 포인터와 메모리 누전과의 차이를 모르겠어요.이 두 용어는 어떻게 관련되어 있습니까?

행업 포인터는 이미 빈 메모리를 가리키고 있다.스토리지가 더 이상 할당되지 않습니다.액세스하려고 하면 Segmentation 장애가 발생할 수 있습니다.

포인터가 매달리는 일반적인 방법:

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 이외의 언어 용어인 not release it call memory leak은 어플리케이션과 예기치 않은 크래시에 치명적입니다.

포인터는 동적 변수라고 하는 변수에 대한 사용자 정의 범위를 만드는 데 도움이 됩니다. Variable은 동일한 유형의 변수 그룹(Dynamic Variable)일 수 .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); 
 }

자세한 내용은 여기를 클릭해 주세요.

삭제(또는 해방)된 메모리 위치를 가리키는 포인터를 당글링 포인터라고 합니다.포인터가 매달리는 포인터 역할을 하는 방법은 세 가지가 있습니다.

  1. 메모리 할당 해제
  2. 함수 호출
  3. 변수가 범위를 벗어남

https://www.geeksforgeeks.org/dangling-void-null-wild-pointers/ 에서

언급URL : https://stackoverflow.com/questions/13132798/difference-between-dangling-pointer-and-memory-leak

반응형