※컴퓨터의 메모리 구조를 알고 보시면 더 쉽게 이해할 수 있습니다.
프로그램을 만들다 보면 상황에 따라 추가적인 메모리 공간을 실시간으로 확보해야 할 경우가 많습니다.
예를 들자면 채팅 대화방에 2명이 접속해 있는데 3명이 더 추가 접속을 했다거나
컴퓨터에 자료를 추가적으로 입력해 저장해야 하거나 등....
여러가지 경우가 있습니다.
이것은 컴퓨터의 소프트웨어 사용시 변화가 유동적으로 일어나기 때문에 어찌보면 당연한 일이기도 합니다.
서론이 긴 이유는 제가 공부하고 배우면서 이 동적 메모리의 사용 이유를 제대로 파악하지 못한 채 배웠고
그로 인해 무엇이 중요한지도 제대로 모르고……. 답답한 느낌도 들고…….
무엇을 공부하거나 배울 때 목적이나 이유를 알고 지식을 습득하는 것이
얼마나 중요한지를 알기에 이렇게 글을 써봅니다.
우선 사용법 입니다.
#include<iostream>
class A {
int num;
};
int main(void) {
A *p = new A();
int *arr = new int[10];
delete p;
delete arr[]; //delete p, arr[]; 로 대체 가능
return 0;
}
정말 간단하죠?
주의해야 할 점은 반환 값이 주소 값 입니다.
때문에 포인터로 받아야 하구요.
이 주소 값을 받아오는 곳은 힙 이라는 메모리 영역에서 받아오게 됩니다.
이 주소 값은 해당 데이터의 시작점 주소 값 입니다.
그럼 주소 값을 확인해 보겠습니다.
스택과는 다르게 힙은 아래에서 위로 주소 값을 할당받고 있습니다.
즉, 스택은 100부터 시작한다면 96, 92...로 할당받는 주소 값이 낮아지는 반면
힙 에서 할당 받은 주소 값은 0부터 4, 8.... 이렇게 증가하는 걸 알 수 있습니다.
이것에 이유가 궁금하시다면 메모리 구조 보러가기!!
할당 받고 다 사용이 끝난다면 당연히 메모리에서 해제를 시켜줘야 합니다.
해제를 안시켜 준다면 프로그램이 끝날때 까지 계속 메모리에 상주하고 있기 때문입니다.
해제 방법은 delete를 이용하면 됩니다.
delete(주소 값)을 넣어주게 되면 해당 시작 주소부터 해당 데이터의 끝 주소까지 메모리를 해제하게 됩니다.
그럼 이제 new와 malloc의 차이점에 대해 알아보겠습니다.
1.
malloc은 해당 포인터의 타입을 모르기 때문에 리턴값의 자료형은 (void *)입니다. 때문에 malloc함수를 사용시
int * i = (int*) malloc(sizeof(int))로 즉, 자료형을 앞에 선언해 줘야 합니다.
하지만 new는 type-safe로 해당 객체에 맞는 포인터로 반환해 줍니다.
때문에 별도의 자료형 선언을 할 필요가 없지요.
(type-safe란 컴파일러가 타입형을 확인해주는 것입니다.
길게 풀어 써 보자면 int형은 int형으로 String형은 String형으로 잘 저장되고 있는지 확인하는 것입니다.)
2.
new를 이용해 객체를 생성하면 초기 값을 줄 수 있습니다.
Test a = new Test(123); 이런 식으로요.
즉, new로 객체를 생성하면 생성자가 호출된다는 뜻입니다.
하지만 malloc은 생성자 호출 기능이 없습니다.
즉, 초기값을 줄 수 없습니다.
3.
new를 통해 객체생성시 에러가 발생하면 예외처리를 하지만
malloc은 예외처리 없이 NULL값을 반환하게 됩니다.
4.
malloc은 realloc으로 할당된 메모리 크기를 재조정이 가능합니다.
하지만 new는 할당된 크기에 대한 메모리 재조정이 불가능 합니다.
delete와 free의 차이점은 다음과 같습니다.
메모리를 해제한다는 점은 같지만
delete는 소멸자를 호출해 줍니다.
하지만 free는 소멸자를 호출해 줄 기능을 갖고 있지 않습니다.
동적으로 메모리를 할당받게 되면 반드시 해제시켜야 한다고 많이 말씀들 하십니다.
저도 같은 생각이고요.
하지만 프로그램이 다 끝나면 운영체제에서 메모리를 반환해 줍니다.
또한 컴퓨터 성능이 좋아지고 메모리 공간도 많아짐에 따라 굳이 해제의 필요성도 못 느낀다는 경향도 있습니다.
가비지 컬렉터를 사용해 효율적인 메모리 해제를 사용하자는 글도 보았습니다.
하지만 저는 메모리 할 당시 해제하는 습관을 드리는 것을 추천을 합니다.
어찌 됐든 필요 없는 메모리는 굳이 계속 공간을 잡아먹을 필요도 없을뿐더러
PC가 아닌 Embedded로 가게 되면 성능이 좋지 못한 것들이 많아 메모리를 효율적으로 활용해야 합니다.
때문에 저는 무조건 사용하시라는 말씀보단 권장이라는 단어로 추천해 드리고 싶습니다.
'프로그래밍 > C++' 카테고리의 다른 글
C++의 생성자, 문자열 초기화 C2664 오류시 해결!! (1) | 2019.02.20 |
---|---|
C++ public, protected, private에 대한 설명 (1) | 2019.02.19 |
객체, 인스턴스, 클래스 용어 정리!! (0) | 2019.01.17 |
C++ 클래스 정의, 구조체와 차이점(접근제어 지시자) (0) | 2019.01.17 |
C와 C++의 차이, 절차지향과 객체지향의 차이점!!(객체지향 사용 이유) (0) | 2019.01.17 |
댓글