Malloc, New 키워드의 차이
동적 할당을 할 때에는 Malloc과 New 키워드를 사용할 수 있는 데, 2가지의 차이점이다.
#include <iostream>
int main()
{
// 둘 다 동적할당임.
malloc // 생성자 호출 없이 메모리 잡음. c언어에서 쓰던 함수.
new // 생성자 호출 해 줌. 내부에서 malloc을 쓰고, 생성자도 불러준다.
}
해제 할 때는 free랑 delete 키워드가 있는데,
free는 소멸자 안 불러준다.
delete는 소멸자 호출하고 삭제한다.
C++에서는 new, delete 키워드를 사용하면 된다.
동적할당 예시 코드
일반 변수
#include <iostream>
int main()
{
int *p{};
p = new int{};
*p = 100;
printf("%d\n", *p);
delete p;
}
1차원 배열
#include <iostream>
int main()
{
int *p{};
p = new int[5]{};
for (int i = 0; i < 5; i++)
{
printf("%d\n", p[i]);
}
delete[] p;
}
2차원 배열
#include <iostream>
int main()
{
int(*p)[4]{};
p = new int[3][4]{};
delete[] p;
}
#include <iostream>
int main()
{
int ** p{};
p = new int *[3]{};
for (int i = 0; i < 3; i++)
{
p[i] = new int[4]{};
}
for (int i = 0; i < 3; i++)
{
delete[] p[i];
}
delete[] p;
}
예시 코드를 보면 알 수 있겠지만,
new를 2번 했으면 delete도 2번 하는 느낌으로 코딩하면 헷갈리지 않는다.
어차피 프로그램이 종료되면서 메모리 해제가 되지만,
게임같이 프로그램이 종료되지 않는 코드에서 동적할당을 쓸 때, delete 키워드는 필수이다.
프로그래밍 처음 배울 때는 컴파일 할 때마다 메모리가 잡히기만 해서 용량 잡아먹히는거 아닌가 생각했다. ㅋㅋㅋ
예시 문제) 행과 열 입력받아 동적할당하고 출력하기
#include <iostream>
int main()
{
int **p{};
int nRow{};
int nColumn{};
// 행과 열 입력받기
printf("nRow = ");
scanf_s("%d", &nRow);
printf("nColumn = ");
scanf_s("%d", &nColumn);
// 동적 할당하기
p = new int *[nRow] {};
for (int i = 0; i < nRow; i++)
{
p[i] = new int[nColumn] {};
}
// 출력하기
for (int i = 0; i < nRow; i++)
{
for (int j = 0; j < nColumn; j++)
{
printf("%d\t", p[i][j]);
}
printf("\n");
}
// 메모리 해제하기
for (int i = 0; i < nRow; i++)
{
delete[] p[i];
}
delete[] p;
}
'기타 > C++' 카테고리의 다른 글
[C++] 메모리 관리, 누수잡기 (0) | 2020.12.23 |
---|---|
[C++] 참조자 (reference), 포인터와의 차이 (0) | 2020.12.23 |
[C++] 클래스 생성자에 대해서 (0) | 2020.08.16 |
[C++] 클래스 기본 동작 개념 (0) | 2020.07.10 |
[C++] 클래스 기본 문법 / 클래스와 구조체의 차이 (0) | 2020.06.06 |