Computer Science/C++

[C++] C++ new, delete - 씹어먹는 C++ 3강

토마토. 2021. 7. 19. 13:11

서론

object oriented programming

메모리 관리는 중요한 문제

프로그램이 실행되려면, 모든 변수의 주소값이 확정되어야 한다.

이런 문제를 해결하기 위해 'heap' 공간이 생겼다.

프로그램 실행시에 자유롭게 할당/해제할 수 있는 공간이다.

heap은 stack에 비해 안정성이 떨어진다.

 

C에서와 같이

힙에서의 메모리 할당을 위해 

malloc, free 함수를 이용할 수 있다.

C++에서는 이외에도

malloc에 대응하는 new와

delete에 대응하는 free를 사용할 수 있다.

 

new와 free 사용법

<new syntax>

type *pointer = new type;

<free syntax>

delete pointer;

#include <iostream>

int main() {
  int *p = new int;
  // new int -> sizeof(int)만큼의 공간을 할당한다.
  // int *p = -> 그 공간의 주소값을 p에 집어 넣음
  *p = 10;

  std::cout << *p << std::endl;

  delete p;
  return 0;
}

int *p = new int;

new int -> sizeof(int)만큼의 공간(heap)을 할당한다

int *p = new int; -> 해당 주소값을 p에 대입한다.

 

new로 배열 할당하기

#include <iostream>

int main(){
  int arr_size;
  std::cout<<"array_size";
  std::cin >> arr_size;

  int *list = new int[arr_size];

  for (int i = 0;i<arr_size;i++){
    std::cout<< i << " th element";
    std::cin >> *(list + i);
  }

  for (int j = 0; j < arr_size; j++){
    std::cout << *(list+j) << std::endl;
  }

  delete[] list;
  return 0;
}

 

돌아온 마이펫

switch 이용한 표현

#include <iostream>

typedef struct Animal {
  char name[30];
  int age;
  int health;
  int food;
  int clean;
} Animal;

void create_animal(Animal *animal){
  std::cout<<"name : ";
  std::cin >> animal->name;

  std::cout<<"age : ";
  std::cin >> animal->age;

  animal->health = 100;
  animal->food = 100;
  animal->clean = 100;
}

void play(Animal *animal){
  animal->health += 10;
  animal->food -= 20;
  animal->clean -= 30;
}

void one_day_pass(Animal *animal){
  animal->health -= 10;
  animal->food -= 30;
  animal->clean -= 20;
}

void show_stat(Animal *animal){
  std::cout << "name : " << animal->name << std::endl;
  std::cout << "health : " << animal->health << std::endl;
  std::cout << "food : " << animal->food << std::endl;
  std::cout << "clean : " << animal->clean << std::endl;
}

int main(){
  int animal_num = 0;
  Animal *list[10];
  while (1) {
    std::cout << "1. 동물 추가하기 " << std::endl;
    std::cout << "2. 놀아주기 " << std::endl;
    std::cout << "3. 상태 보기" << std::endl;
    std::cout << "4. 끝" << std::endl;

    int input;
    std::cin >> input;
    if (input==4){
      break;
    }
    switch(input){
      int play_with;

      case 1:
        list[animal_num] = new Animal;
        create_animal(list[animal_num]);

        animal_num++;
        break;
      case 2:
        std::cout << "who?";
        std::cin >> play_with;
        if (play_with < animal_num){
          play(list[play_with]);
        }
        break;

      case 3:
        std::cout <<"who?";
        std::cin >> play_with;
        if (play_with < animal_num){
          show_stat(list[play_with]);
        }
        break;


    }

    for (int i = 0; i != animal_num; i++){
      one_day_pass(list[i]);
    }
  }
  for (int i = 0; i != animal_num; i++){
    delete list[i];
  }
  return 0;
}

** 구조체 복습 필요함 **

 

객체 지향 프로그래밍의 필요성

 

(1)

위 코드에서는

main함수에서

void show_stat이라는 함수를 호출하고

show_stat에서 구조체에 접근했다

 

만약,

구조체 자체에 함수가 있고

각 구조체 변수가 자신의 함수가 있으면 어떨까?

(ex - list[play_with]->play())

 

다음 강의 예고

<4. 객체로 이루어진 C++>

- 객체 지향 프로그래밍의 도래 -

- 객체란? 클래스란? -

- 접근 지시자 public, private -