int* p = new int(3);
new는 동적할당을 하는 연산자이다. 함수가 아니라 연산자다.
내부적으로 malloc으로 만들어졌으며 선언과 동시에 초기화를 할 수 있다.
delete p;
p = nullptr;
delete 연산자도 내부적으로 free로 만들어졌다.
free와 다르게 delete 후 포인터 p의 값은 변경되지만 이 역시 댕글링 포인터이므로 nullptr로 설정해줘야한다.
int* pArray = new int[4];
int* pArray = new int[4]{10,20,30,40};
int* pArray = new int[4]{}; //{0,0,0,0}
동적배열을 생성하는 방법으로 역시 선언과 초기화를 동시에 할 수 있다.
메모리 관리 함수
memset(초기화할 공간 주소값, 채울 값, 채울 공간의 크기)
메모리공간의 값을 원하는 값으로 설정한다. 주로 블록단위 데이터를 초기화할 때 사용한다.
memcpy(복사받을 데이터 주소, 원본 데이터 주소, 복사받을 메모리 크기)
배열의 요소를 일일이 대입하지 않고 memcpy로 배열을 한번에 복사할 수 있다.
memmove(복사받을 데이터 주소, 원본 데이터 주소, 복사받을 메모리 크기)
복사이동함수라고는 하는데 memcpy처럼 메모리를 복사한다는 것은 같다.
memcpy는 메모리에 내용을 직접 복사하고 memmove는 임시저장소에 저장하고 복사하기 때문에
memcpy는 원본 데이터 공간과 복사받을 데이터 공간이 겹치면 동작이 성립되지 않는다.
int ori[25] = {1,2...,25};
memcpy(ori+4,ori+2,sizeof(int)*10); //(x)
memmove(ori+4,ori+2,sizeof(int)*10); //(o)
위 코드를 보면 ori[2] 부터 요소 10개가 ori[4]부터 복사되어야 하는데 원본과 사본이 겹치기 때문에
제대로 동작하지 않는다. 이럴 경우에는 memmove를 사용해야 한다.
'Today I Learned' 카테고리의 다른 글
| 23.02.02 - 파일 입출력2, 매크로, 레퍼런스 (0) | 2023.02.02 |
|---|---|
| 23.02.01 - 스트림, 콘솔 입출력, 파일 입출력 (0) | 2023.02.01 |
| 23.01.30 - 공용체, 동적 할당 (0) | 2023.01.30 |
| 23.01.27 - 문자열 함수, 구조체 (0) | 2023.01.27 |
| 23.01.25 - 시간 복잡도, 이차원 배열과 포인터, 함수 포인터 (1) | 2023.01.25 |