Computer >> 컴퓨터 >  >> 프로그램 작성 >> C++

힙 오버플로 및 스택 오버플로

<시간/>

힙 오버플로

힙은 동적 변수를 저장하는 데 사용됩니다. 프로세스의 메모리 영역입니다. malloc(), calloc(), resize() 이러한 모든 내장 함수는 일반적으로 동적 변수를 저장하는 데 사용됩니다.

힙 오버플로가 발생하는 경우 -

A) 동적으로 많은 수의 변수를 할당하는 경우 -

int main() {
   float *ptr = (int *)malloc(sizeof(float)*1000000.0));
}

B) 메모리를 지속적으로 할당하고 사용한 후 해제하지 않는 경우.

int main() {
   for (int i=0; i<100000000000; i++) {
      int *p = (int *)malloc(sizeof(int));
   }
}

스택 오버플로

스택은 후입선출 데이터 구조입니다. 함수 내에서 사용되는 지역 변수를 저장하는 데 사용됩니다. 매개변수는 이 함수와 반환 주소를 통해 전달됩니다.

프로그램이 더 많은 메모리 공간을 사용하면 컴퓨터 메모리의 스택 크기가 제한되어 스택 오버플로가 발생합니다.

스택 오버플로가 발생하는 경우

A) 함수가 자체적으로 무한 반복적으로 호출되면 스택은 많은 수의 지역 변수를 저장할 수 없으므로 스택 오버플로가 발생합니다 -

void calculate(int a) {
   if (a== 0)
      return;
      a = 6;
      calculate(a);
}
int main() {
   int a = 5;
   calculate(a);
}

B) 많은 수의 지역 변수를 선언하거나 큰 차원의 배열이나 행렬을 선언하면 스택 오버플로가 발생할 수 있습니다.

int main() {
   A[20000][20000];
}