승쨩개발공부

[C++] 동적할당 본문

C++

[C++] 동적할당

SeungHyune 2021. 11. 29. 19:36

동적할당

사용자가 원할 떄 메모리에 등록하고,

사용자가 원할 떄 메모리에서 해제하는 것.

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