승쨩개발공부
[C++] 동적할당 본문
동적할당
사용자가 원할 떄 메모리에 등록하고,
사용자가 원할 떄 메모리에서 해제하는 것.
Heap 영역에 등록이 된다.
malloc()
void* : 할당할 메모리의 시작 주소를 반환
-> 단, 시작 주소부터 몇 bytes를 사용할 것인지, 어떤 데이터로 다룰 것인지 모르는 상황이다.
-> 이러한 문제를 해결하기 위해 형 변환을 진행해야만 한다.
size_t _size : Heap 영역에 몇 byte 크기로 메모리를 예약할 것인지 전달.
Heap 영역에 메모리를 할당
malloc();
Heap 영역에 4bytes만큼 메모리를 할당
malloc(4); // Heap 영역에 4Bytes만큼 메모리를 할당.
Heap 영역에 4bytes만큼 메모리를 할당해줘
이후, 반환되는 시작 주소를 int*형으로 바꿔줘
형 변환까지 진행했으면 ptr이 할당된 곳에 주소를 저장해줘
-> int* ptr = (int*)malloc(4);
동적할당 해제
free() 를 사용한다
int* ptr = (int*)malloc(4);
cout << "ptr : " << ptr << endl; // Heap 영역의 주소
free(ptr);
cout << "ptr : " << ptr << endl; // Dangling Pointer
Dangling Pointer?
해제된 메모리의 주소를 들고 있는 위험한 포인터.
Dangling Pointer 해결 방법
동적할당 해제 후 nullptr로 다시 초기화를 진행한다.
int* ptr = (int*)malloc(4); // Heap 영역에 4bytes만큼 메모리를 할당후 시작주소 int*형으로 형변환 후 ptr에 주소 저장
cout << "ptr : " << ptr << endl; // Heap 영역의 주소 ex) 00BA86A8
free(ptr); // 동적할당 해제
ptr = nullptr; // 초기화
cout <<"ptr : " < ptr << endl; // 동적할당 해제후 초기화가 진행된 주소 00000000
C++ 기반의 동적 할당
연산자를 사용한다.
new 자료형
int의 크기만큼 메모리 공간을 할당하고
int의 포인터형으로 주소를 형 변환하여 변환한다
-> int* ptr = new int;
double의 크기만큼 메모리 공간을 할당하고
double의 포인터형으로 주소를 형 변환하여 반환한다
-> double* ptr2 = new double;
동적할당 해제
delete 를 사용한다
int* ptr = new int;
cout << "ptr : " << ptr << endl;
cout << "*ptr: " << *ptr << endl;
delete ptr; // free와 같은 용도
int* ptr = new int;
cout << "ptr : " << ptr << endl; // Heap 영역의 주소
delete ptr;
cout << "ptr : " << ptr << endl; // 0008123
00008123
nullptr과 마친가지로 아무런 곳도 가리키고 있지 않다.
-> Dangling Pointer
결국 delete로 동적할당을 해제한 후 nullptr로 초기화를 진행하자.
int iA = 10;
int iB(20);
int* ptr new int(10);
cout << "*ptr: " << *ptr << endl; // 10
동적 배열 만들기
배열을 선언하는 것 처럼 대괄호를 이용해서 크기를 명시하면 된다.
int iSize = 0;
cin >> iSize;
int* ptr = new int[iSize];
memset(ptr, 0, sizeof(int) * iSize);
for (int i = 0; i <iSize; ++i)
cout << ptr[i] << endl;
동적 배열 해제
배열을 해제한다라고 알려주어야한다.
delete // 해제해줘!
detete[] // 배열을 해제해줘!
delete[] ptr // 동적 배열 해제.
ptr = nullptr; // ptr null로 초기화.
int iSize = 0;
cin >> iSize;
int* ptr = new int[iSize];
delete[] ptr;
ptr = nullptr;
'C++' 카테고리의 다른 글
[C++] 입출력,스트림,버퍼,경로 (0) | 2021.11.30 |
---|---|
[C++] 메모리 구조 (0) | 2021.11.30 |
[C++] Text RPG (0) | 2021.11.26 |
[C++] 구조체(struct) (0) | 2021.11.26 |
[C++] 문자열 함수 / 메모리 함수 (0) | 2021.11.25 |