Thứ Bảy, 11 tháng 5, 2019

C++ _ 동적 할당 ( Dynamic Allocation ) : 네이버 블로그

c++ 동적할당 크기,c++ 동적할당 예제,c++ 동적할당 이유,c++ 동적할당 배열 초기화,c++ 동적할당 delete,c++ 동적할당 소멸자,c++ 동적할당 배열 크기,c++ 동적할당 해제,c++ 동적할당 초기화,c++ 동적할당 배열,

C++

C++ _ 동적 할당 ( Dynamic Allocation )

c++ 동적할당 크기,c++ 동적할당 예제,c++ 동적할당 이유,c++ 동적할당 배열 초기화,c++ 동적할당 delete,c++ 동적할당 소멸자,c++ 동적할당 배열 크기,c++ 동적할당 해제,c++ 동적할당 초기화,c++ 동적할당 배열,

2016. 3. 21. 18:53

이웃추가

지금 까지 우리는 변수 선언을 정적 으로만 선언하였다.


무슨소리냐??


예를 들면함수에서 int num; 이라는 변수를 만들었을 때, 이 num 이라는 이름을 가진 int형 변수를 위해서 


stack 메모리 영역에 4Byte 크기의 공간을 지정해 주는 것이다.


배열로 선언하는 것 역시 정적 할당이다. int arr[100]; 이라는 선언을 하게되면 arr이라는 이름을 가진 int 형 


배열에 4Byte * 100 의 공간을


할당해 주는 것이다.


그렇다면 동적 할당은 무엇일까??


크기가 정확히 얼만큼 요구되는지 모르는 경우에 주로 사용된다. 


동적 할당은 매우매우 유용한 기능이다. 만약 Dongmin 이라는 클래스의 객체가 얼마나 요구될지 모른다고 가정하자.


이때 우리는 넉넉하게 Dongmin 이라는 객체 배열을 100 의 크기로 잡아주었다.


그런데 막상 사용해보니 10개의 객체만 필요로 되어진다고 하자. 그러면 나머지 90개의 메모리는 낭비되는 것이다.


반대로 100을 잡아주었는데 200개가 필요하다. 이렇게 되면, 런타임 에러가 날 가능성이 크다.      





낭비되는 메모리가 너무 많지 않은가??


이때 동적할당을 사용하면된다!!


C에서는 3가지 함수가 있따. 


1. malloc - memset과 함께 쓰인다. 선언은 malloc, 초기화는 memset


2. calloc - 할당과 동시에 초기화


3. realloc - 할당의 크기를 늘려준다


​위의 함수를 이용해 동적 메모리를 할당해주면 힙 메모리에 저장공간이 생기고 주소값을 반환해 준다. 


C++에서는 


new 연산자 와 delete연산자를 사용한다.


new 는 위의 세가지와 같은 역할을 하며, delete는 free 함수와 같은 역할을 한다.


new를 했는데 만약 메모리에 공간이 없다면 NULL을 반환하게 된다.


때문에 NULL 체크를 항상 해주어야 한다.


new는 자바와 같은 키워드이다. 사용 방법역시 비슷하다.


(단, 자바에서는 동적 할당의 개념이 없다. 그리고 객체의 소멸은 가비지 컬렉터가 처리해 주기 때문에 


delete는 사용하지 않는다.)


아래는 그 예이다.

 


전부 new 키워드를 이용해서 동적 할당을 하고 있다.


1. 변수는 포인터로 선언한다.


2. new "객체의 타입"(초기화할 값);


3. 이때 초기화활 값을 넣지 않으면 기본 생성자가 호출된다.





결과에서 볼 것은 delete 호출의 순서에 있다. 


여태까지 객체는 함수의 종료와 동시에 생성자 호출의 역순으로 소멸자가 호출 되었다.


그런데 동적 할당의 경우 delete 선언의 순서에 따라서 소멸자가 호출된다.


이때 동적 할당이 아닌 정적 변수의 주소값을 가지고 있는 포인터를 delete 할 경우 에러가 발생한다.


​&배열의 동적 할당 


​배열의 동적할당 ​역시 별 다를 바 없다. 다만 배열이라는 것을 명시해주면 되는 것이다. 


 


배열의 크기를 정해주고 동적 할당을 해준다. 이 역시 배열처럼 index값으로 접근을 한다.


할당을 해지 해줄때는 delete 키워드를 이용해주고 배열의 경우 대괄호 [] 를 이용해서 배열이라는 것을 명시해준다.


이 역시 배열과 같이 선언과 동시에 초기화가 가능하다.


 


이번에는 객체를 배열로 동적 할당을 해보자.


 


앞서 내가 계속 포인터가 4byte 라고 말해왔는데 ... 이게 내가 분명 C를 할때는 4 였는데 ㄷ ㄷ 


이게 64bit 운영체제 에서는 다른건지 Mac OS라 다른건지, 아니면 컴파일러가 달라서 4인건지 아니면 ㄷ ㄷ ㄷ ㄷ 


원래 8byte 였는지는 모르겠지만 무튼 위의 sizeof 를 통한 결과값도 잘 숙지하도록 하자. ( 주석을 읽어보자!!)


 


이 경우에는 delete를 이용한 소멸자의 호출을 보면 일반 배열의 소멸자 순서와 같다.


​& 동적 할당과 포인터의 관계 


동적 할당의 메모리를 저장하는 변수 역시 위에서 포인터라고 간략하게 설명했다.


아래는 그 예시를 보여준다.

 

Link Source : http://m.blog.naver.com/vgb910526/220661295961

Không có nhận xét nào:

Đăng nhận xét