[C++] 3. new, delete

Sireal·2022년 2월 16일
0

new, delete

C에서는 힙메모리 영역을 사용할 때 malloc(), free()를 사용했다.
C++에서는 malloc과 유사한 new, free와 유사한 delete 가 있다.

#include <iostream>

int main(){
	int* p = new int;
	*p = 10;

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

	delete p;
	return 0;
}
  • new로 int크기 만큼 메모리 할당, delete로 풀어줬다.
  • new를 안쓰고 delete 만 사용하면 오류가 나니 주의하기

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::cin >> list[i];
  }
  for (int i = 0; i < arr_size; i++) {
    std::cout << i << "th element of list : " << list[i] << std::endl;
  }
  delete[] list;
  return 0;
}

/* 결과
array size : 3
2
1
4
0th element of list : 2
1th element of list : 1
2th element of list : 4
계속하려면 아무 키나 누르십시오 . . .
*/
  • 변수 선언이 C처럼 항상 맨 위에 선언해야했던 것이,
    C++에서는 중간 중간에 선언할 수 있도록 바꼇다
T* pointer = new T[size];
  •   T* pointer = (T*)malloc(sizeof(T)*size); 
    에서 이렇게 예쁘게 바꼈다.
delete[] T;
  • free(T); 인데 배열삭제시 [ ]을 꼭 넣어야 한다.
  • 이렇듯 new로 배열을 만들때는 new[], delete[] 이렇게 한 세트다.

new 배열로 할당(2)

구조체도 malloc, free 하듯 new, delete 해보자.

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


//main.c
Animal *list[10];
int animal_num = 0;

...

list[animal_num] = new Animal;

...

for(int i = 0 ; i != animal_num; i++) 
	delete list[i];		
  • 구조체 Animal 형으로 포인터배열을 10개 사이즈로 선언
  • 해당 포인터배열[위치] 에 새로운 Animal구조체를 new를 사용하여 넣어준다.
    • list[anmial_num] = new Anmial ; // (Anmial*)malloc(sizeof(Anmail));
  • delete는...

어이구 헷갈려..

규칙을 한번 살펴보자. 위의 코드에서 사용된 new와 delete 이다.

newdelete
int * p = new intdelete p
int * list = new int[arr_size]delete[ ] list
(Animal*) list[n] = new Animaldelete list[n]
  • 단순하게 'new 자료형' 만 하면
    • 'delete 변수' 하면 된다.
  • 하지만 new로 배열을 만들게 될땐, 'new 자료형[사이즈]' 이런 모양이 된다.
    • 이때 delete도 'delete[] 변수' 가 된다.

고로 바로위 코드의 delete는
list[n]변수에 그냥 new만 시켜준 메모리를 지우면 돼서,

'delete list[n]' 

이다.

profile
🚄계속 앞으로🚄

0개의 댓글

Powered by GraphCDN, the GraphQL CDN