본문 바로가기

c언어

동적 할당(신버전) + 메모리 관련 함수들

우리는 malloc과 calloc, realloc 그리고 할당을 해제하는 free함수들을 배웠다. 

 

사실 이 네가지 함수는 이제 잊어도 좋다. 새로나온 개쩌는 동적할당함수가 나왔기 때문이다. 매우 직관적이고 사용또한 편하다.

 

new와 delete이다. 각각의 형태는 다음과 같다.

자료형* 변수명 = new 자료형;

delete 변수명;

더 설명할것이 없다. 그냥 저게 다이기 때문이다.

자료형을 입력하면 자동으로 그 자료형만큼의 바이트를 할당하고 무엇보다 malloc과는 달리 그 자료형의 포인터로 자동 변환해주어 바로 그냥 같은 자료형의 포인터에 넣어주면 그만인것이다.

또한 delete를 이용하여 그 할당받은 공간을 할당 해제할 수도 있다.

 

예를 들어보겠다.

int* iTemp= new int;

delete iTemp;
iTemp=nullptr;

iTemp라는 int형 포인터에 int크기만큼의 공간을 할당받았다.

 

그리고 그것을 해제한것이다.

다만 이경우 이전에 말했던 댕글링 포인터에 대한 위험은 여전히 존재하기에 iTemp에 더이상 접근하지 못하도록 nullptr을 넣어주었다.

 

역시 새로운것이 좋은것이다. 훨씬 편하다. 이걸로 동적할당 신버전이 끝났다.

 

혹시 "배열에 대한 할당은 어떻게하나요??" 라고 묻는 사람이 있을 수도 있다.

간단하다.

int* iArr=new int[배열의 크기];

delete[] iArr;
iArr=nullptr;

이렇게 일반적 배열을 선언하는 방법과 크게 다르지 않다. 다만 주의할 점은 이전처럼 delete iArr하게 된다면

iArr배열의 첫번째 공간만을 할당 해제하게 되어 나머지 할당받은 공간은 누수되게 된다.(할당이 해제되지 않은 상태의 메모리를 누수된다고 표현한다.)

 

 

동적할당신버전이 진짜로 모두 끝났다. 하지만 여기서 포스팅을 마치기엔 너무 짧으니 추가적으로 메모리 관련 함수들을 적어보겠다. 동적할당과는 직접적 연관이 없다. 하지만 종종 쓰인다고 가르쳐주시더라. 사실 아직 써본적 없다.

 

첫번째는 바이트단위 입력함수 memset이다.

memset(초기화할 주소값,채울 데이터,공간의 크기);

초기화할 주소값을 기준으로 공간의 크기만큼 모든 바이트를 채울 데이터로 바꾼다. 바이트 단위 복제이기때문에 모든 바이트가 채울 데이터로 변환된다. 즉

int* iTemp=new int;

memset(*iTemp,1,sizeof(int));

라고 하게 되면 iTemp의 4바이트는 모두 1로 변하게 된다. 즉 00000001이 네번 반복되는 형태의 코드가 완성된다.

이게 무슨 의미가 있느냐고?? 

 

없다!!! 그래서 보통 0을 초기화 하기위해 채울 데이터 항목을 0으로 넣어 할당받은 공간을 0 초기화하는데 쓰인다.

(근데 그마저 그냥 대입 연산자로 0 넣는게 편하다.)

 

다음은 바이트 단위 복제함수 memcpy이다.

memcpy(복사받는 주소값,복사할 주소값,원하는 크기);

이렇게 된다면 복사받는 주소값에 복사할 주소값의 데이터가 온전히 입력된다. 하지만 이또한 그냥 대입연산자로도 충분히 할 수 있는 작업이다.

 

다음은 메모리 이동 함수 memmove이다.

memmove(복사받는 주소값,복사할 주소값,원하는 크기);

위의 memcopy와 함수명 빼고 동일한 구조를 가지고 있고, 그 결과도 동일하다. 그리고 이 함수의 연산 처리속도가더 느리기까지 하다.

 

뭐야 그럼 왜있는 함수야??

둘의 차이점은 단 한가지이다.

memcopy함수는 리눅스에서 사용이 불가능하다.

즉, 리눅스에서는 memmove만이 사용 가능하다.

 

하지만 보통의 경우 리눅스 운영체제를 만질 일이 크게 있지는 않다. 그래서 딱히 신경쓰지 않아도 된다.

 

이상으로 동적할당 신버전과 메모리함수를 마친다.

'c언어' 카테고리의 다른 글

파일 입출력 -파일 읽기 및 쓰기  (0) 2023.02.09
파일입출력  (0) 2023.02.07
동적 할당(구버전)  (0) 2023.02.06
사용자 정의형 자료형 - 공용체와 열거체  (0) 2023.02.06
사용자 정의형 자료형 - 구조체  (0) 2023.02.06