본문 바로가기
C++/C++ 기본

[C++] 공부하다가 궁금한 것(new, new[], delete, delete[])

by Oliver_Candy 2024. 4. 5.

코딩 공부하다가 C언어에서 malloc, free와 비슷한 new, delete를 책에서 공부하다가 궁금한 것들이 많이 생겨버렸다. 아직까지는 구글링으로 다양하게 찾아보고 있는데, 책을 다 읽으면 해결이 될 문제일지 아니면 계속 모를지 몰라서 일단은 기록해 놓고 나중에 답을 한 번 찾아봐야겠다. 이미 찾아본 것도 있지만 계속해서 궁금증이 끊임없이 생겨서 진도를 못 나갈까 봐 일단은 킵해놓아야지....

 

 

 궁금점 1. new와 new[], delete와 delete[]의 차이 왜 차이를 두고 만들었을까?

new와 delete키워드(? 연산자인가 함수인가)를 배웠을 때, 이 둘은 C언어에서 malloc과 free와 비슷한 걸로 c++에서는 이것들을 사용하라고 하였다. 그런데, malloc과 free는 그냥 포인터 변수를 하나 만들어서 특정한 크기의 공간 주소를 할당하고 반납하는 함수여서 모든 포인터 변수들은 그냥 malloc하고 그 변수에 free하면 되었다. 

그런데 왜 C++에서는 new와 new[], delete와 delete[]를 따로 만들었을까? 궁금해지기 시작하였다.

차이점은 stackoverflow에서 찾아보았는데,  new, delete에서는 하나의 객체나 자료형을 만들고 없애기 위해사용하고 new[], delete[]는 객체나 자료형 배열을 만들고 없애기 위해서 사용한다는 것을 알게 되었다.

따로 만든 이유가 있으니까 따로 만들었겠지? 다시 한번 찾아보아야겠다.

여기 블로그 내용에 괜찮은 것 같은 내용이 보여서 링크로 남겨둔다.

https://dataonair.or.kr/db-tech-reference/d-lounge/technical-data/?mod=document&uid=235893

 

 

 궁금점 2. new char()와 new char[]의 차이점은 무엇일까?

내가 복사생성자 파트를 배우면서 C++코드에서는 아래와 같은 코드 방식으로도 선언과 초기화가 된다는 것을 알게되었다.

int num = 5;
int copy_num = num;
//
int num(5);
int copy_num(num);

//추가적으로 class도 마찬가지로 작동한다.
Car car1;
Car car2 = car1;


Car car1;
Car car2(car1);

이렇게 괄호를 하면 복사생성자처럼 만들어지니까 new에서도 괄호를 해도 똑같이 되지않을까? 라는 이상한(?) 생각을 하였다.

// 2번과 3번 라인은 똑같이 동작할 것이라고 생각함
char* msg = new char[5];
char* msg = new char(5);

 

 

하지만 stackoverflow에 찾아보기도 하고 실제로 실행도 해보니까 delete[] 할 때 오류가 발생하였다.

stackoverflow에서도 new char(5)의 의미는 char 자료형 1개만 만들고 5를 대입한다는 뜻이었고 new char[5]는 말 그대로 5개의 char배열을 만든다는 뜻이었다. 틀렸지만 알아냈다는 것 자체에 만족하고 있다.

 

출처 : https://stackoverflow.com/questions/60816962/new-char-vs-new-char-delete-vs-delete

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

[C++] 1. C++ 입출력  (0) 2023.12.24
[C++] 0.시작  (2) 2023.12.23

댓글