ted0505
Computational Art & Study
ted0505
전체 방문자
오늘
어제
  • 분류 전체보기 (79)
    • Computer Science ( CS ) (0)
    • Computational Thinking (6)
    • 프로젝트 개발일지 (1)
    • Coding (52)
      • C++ (39)
      • JavaScript (2)
      • P5.JS (7)
      • Python (0)
      • HTML5 (1)
      • CSS (0)
    • Game Engine (18)
      • Unreal Engine 4 (18)
      • Unity (0)
    • Physically Based Rendering (0)
    • FilmMaking (0)
    • 잡다 (0)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
ted0505

Computational Art & Study

Coding/C++

[ C++ ] chapter 6.11 : 메모리 동적 할당 new와 delete

2022. 3. 27. 22:35

# 프로그램에서 메모리가 할당 되는 방법들

  • Static memory allocation ( 정적 메모리 할당 )
    • 전역변수, 스태틱 변수 같이 한번 만들어지면 끝날 때까지 가지고 있는 것을 의미한다.
    • 고정된 메모리.
  • 자동 메모리 할당
    • 변수를 선언하거나 정적 배열을 선언 했을 때 블록 밖으로 나가면 전부 사라지고 다시 메모리가 할당 되는 것을 의미.
  • Dynamic Memory allocation ( 동적 메모리 할당 )
    • 필요할 때만 메모리를 할당받아서 사용하고 반납할 수 있다.

 

# 스택과 힙

#include <iostream>
using namespace std;

int main()
{
	int array[1000000]; // 안됨. 이유는? stack -> 정적으로 할당하는 메모리는 스택에 들어감.
	return 0;
}
  • stack ( 스택 )
    • 정적으로 할당되는 메모리는 stack에 들어감.
    • stack은 용량이 작음.
  • heap ( 힙 )
    • 동적으로 할당되는 메모리는 heap에 들어감.
    • heap은 용량이 큼.

 

때문에 동적 메모리 할당을 사용하는게 훨씬 효율적이다.

 

# 동적으로 메모리 할당 받기 and 메모리 반납하기

#include <iostream>
using namespace std;

int main()
{
    int var;
    var = 3;
    
    int *ptr = new int;
    *ptr = 3;
    
    cout << ptr << endl;
    cout << *ptr << endl;
    
    delete ptr; // 동적 메모리 해제
    ptr = nullptr; // 아무 의미없는 값이라는 것을 기록.
    
    if (ptr != nullptr) {
        cout << ptr << endl;
        cout << *ptr << endl;
    }
}
  • new int;
    • new는 C++ 연산자다. 
    • new + 데이터타입 : 해당 데이터 타입의 크기만큼 힙 메모리를 할당 받아온 후, 주소를 리턴한다.
    • int사이즈 ( 4byte ) 에 맞춰서 운영체제로부터 메모리를 받아온 다음, 그 메모리 주소를 알려준다.
    • int *ptr = new int; 
      • 운영체제로부터 받아온 4byte 짜리 메모리 주소가 포인터 변수에 저장됨.
  • delete ptr;
    • delete는 C++ 연산자다. 
    • delete 포인터 : 해당 포인터가 가리키고 있는 힙 메모리 영역을 반납한다.
    • os에게 해당 메모리를 돌려주는 것. 동적 메모리 해제.
    • 하지만, 집주소는 그대로 있기 때문에 출력하면 쓰레기 값이 나옴.
      • 출력에서 쓰레기 값이 나오는 것을 방지하기 위해 널포인터로 초기화 시켜주는 습관을 가지자.
      • ptr = nullptr;
      • delete ptr을 할 때, 변수에 null 값을 넣고 조건문으로 널 값이 아닐 경우에만 출력하게 한다.
      • 일종의 트릭.

 

# 메모리 누수 ( Memory leak )

while(true) {
    int *ptr = new ptr;
    cout << *ptr << endl;
}
  • 다음 반복 때 기존 지역변수 ptr은 사라지고, 새로운 ptr이 선언되기 때문에 기존의 new int는 미아가 된다.
  • 주소를 잃어서 메모리를 계속 잡아먹게 되는 것이다. 이게 쌓이면 메모리 과부하가 생긴다.
    • 이 문제는 delete 연산자로 기존의 힙 메모리 영역을 os에게 되돌려주어 누수현상을 방지 할 수 있다.

'Coding > C++' 카테고리의 다른 글

[C++] 동적 할당 배열 Dynamically Allocating Array  (0) 2022.08.13
[ C++ Side Project ] LoginPage 회고  (0) 2022.03.03
[ C++ ] 파일 입출력 ifstream, ofstream, fstream  (0) 2022.03.02
[ C++ ] Chapter 6.10 : C언어 스타일의 문자열 심볼릭 상수  (0) 2022.02.22
[ C++ ] Chapter 6.9 : 포인터 연산과 배열 인덱싱  (0) 2022.02.22
    'Coding/C++' 카테고리의 다른 글
    • [C++] 동적 할당 배열 Dynamically Allocating Array
    • [ C++ Side Project ] LoginPage 회고
    • [ C++ ] 파일 입출력 ifstream, ofstream, fstream
    • [ C++ ] Chapter 6.10 : C언어 스타일의 문자열 심볼릭 상수
    ted0505
    ted0505

    티스토리툴바