C++/포인터 (Pointers)

[C++] 동적 λ©”λͺ¨λ¦¬ ν• λ‹Ή (Dynamic Memory Allocation)

Chan Lee 2023. 12. 19. 22:04

동적 ν• λ‹Ή: Dynamic Memory Allocation

 

μš°λ¦¬λŠ” κ·Έλ™μ•ˆ 정적 할당을 톡해 λ©”λͺ¨λ¦¬λ₯Ό ν• λ‹Ήν•˜κ³  μžˆμ—ˆμŠ΅λ‹ˆλ‹€.

정적 할당을 ν†΅ν•˜λ©΄, μ»΄νŒŒμΌμ„ ν•  λ•Œμ— ν•„μš”ν•œ λ©”λͺ¨λ¦¬κ°€ ν• λ‹Ήλ˜κ³ , μ΄λŠ” ν”„λ‘œκ·Έλž¨ μ’…λ£Œμ‹œκΉŒμ§€ λ³€λ™λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

 

예λ₯Όλ“€μ–΄, ν”„λ‘œκ·Έλž¨ λ‚΄λΆ€μ—μ„œ μ–΄λ– ν•œ μ •μˆ˜ xλ₯Ό μ„ μ–Έν•˜μ˜€λ‹€λ©΄,

κ·Έ  λ³€μˆ˜μ˜ 값은 λ³€ν•  수 μžˆμœΌλ‚˜ λ³€μˆ˜μ—κ²Œ ν• λ‹Ήλœ λ©”λͺ¨λ¦¬λŠ” λκΉŒμ§€ λ³€ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

κ·Έ ν• λ‹Ήλœ λ©”λͺ¨λ¦¬λŠ” sizeof ν•¨μˆ˜λ‘œ μ•Œ 수 μžˆμ—ˆμŠ΅λ‹ˆλ‹€.

 

그에 λ°˜ν•΄ 동적할당은 μ»΄νŒŒμΌμ„ ν•  λ•Œκ°€ μ•„λ‹Œ, λŸ°νƒ€μž„ 도쀑에 λ©”λͺ¨λ¦¬λ₯Ό ν• λ‹Ήν•  수 있게 ν•΄μ€λ‹ˆλ‹€.

동적 할당을 톡해 Heap μ˜μ—­μ— 데이터λ₯Ό ν• λ‹Ήν•  수 μžˆμŠ΅λ‹ˆλ‹€.

즉, 동적 할당은 νž™ μ˜μ—­μ—μ„œ λ°œμƒν•©λ‹ˆλ‹€.

그리고 κ·Έ ν• λ‹Ήλœ 값에 λŒ€ν•œ 접근은 포인터λ₯Ό ν†΅ν•΄μ„œλ§Œ κ°€λŠ₯ν•©λ‹ˆλ‹€.

 

C++ μ—μ„œ 동적 λ©”λͺ¨λ¦¬μ˜ 할당은 new ν‚€μ›Œλ“œλ‘œ μ΄λ£¨μ–΄μ§‘λ‹ˆλ‹€.

λ‹€μŒ μ½”λ“œλ‘œ μ‚΄νŽ΄λ³΄κ² μŠ΅λ‹ˆλ‹€.

 

int *int_ptr{nullptr};
int_ptr = new int; // allocate an integer on the heap

cout << int_ptr << endl;  // 16μ§„μˆ˜ λ©”λͺ¨λ¦¬ μœ„μΉ˜
cout << *int_ptr << endl; // garbage value
*int_ptr = 100;
cout << *int_ptr << endl; // 100

delete int_ptr	// ν• λ‹Ή ν•΄μ œ

 

μ²˜μŒμ— int_ptrλΌλŠ” μ΄λ¦„μ˜ 포인터λ₯Ό λ§Œλ“€μ—ˆμŠ΅λ‹ˆλ‹€.

이후 ν•΄λ‹Ή 포인터가 μ •μˆ˜ 크기의 λ©”λͺ¨λ¦¬λ₯Ό λ™μ μœΌλ‘œ ν• λ‹Ήλ°›μ•˜μŠ΅λ‹ˆλ‹€.

 

이 λ©”λͺ¨λ¦¬μ—λŠ” μš°λ¦¬κ°€ μ •μ μœΌλ‘œ λ³€μˆ˜λ₯Ό μ„ μ–Έν•  λ•Œμ™€λŠ” λ‹€λ₯΄κ²Œ 이름이 μ—†μŠ΅λ‹ˆλ‹€.

κ·Έλž˜μ„œ μœ„μ—μ„œ μ„œμˆ ν•˜μ˜€λ“― int_ptr 포인터λ₯Ό ν†΅ν•΄μ„œλ§Œ μ ‘κ·Όν•  수 μžˆμŠ΅λ‹ˆλ‹€.

 

μ€‘μš”ν•œ 점은 이런 μ‹μœΌλ‘œ ν• λ‹Ήλœ λ©”λͺ¨λ¦¬λŠ” garbage dataλ₯Ό λ‹΄κ³  μžˆμŠ΅λ‹ˆλ‹€.

κ·Έλ ‡κΈ° λ•Œλ¬Έμ— μ΄ˆκΈ°ν™”λ₯Ό ν•˜μ§€ μ•ŠμœΌλ©΄ 였λ₯˜κ°€ λ°œμƒν•©λ‹ˆλ‹€.

μ΄ν›„λŠ” 기쑴의 ν¬μΈν„°μ˜ κ°œλ…κ³Ό λ™μΌν•©λ‹ˆλ‹€.

 

ν•œκ°€μ§€ 더 μ€‘μš”ν•œ 점은 ν• λ‹Ήν•œ λ©”λͺ¨λ¦¬λ₯Ό 이용 이후 delete ν‚€μ›Œλ“œλ‘œ ν• λ‹Ή ν•΄μ œ ν•΄μ£Όμ–΄μ•Ό ν•©λ‹ˆλ‹€.

그렇지 μ•ŠμœΌλ©΄ 동적 ν• λ‹Ήκ³Ό λ‹€λ₯Ό λ°”κ°€ μ—†κ² μ£ ?

 

 

λ°°μ—΄μ˜ 동적 ν• λ‹Ή 

λ°°μ—΄μ˜ 동적 ν• λ‹Ή μ—­μ‹œ λ‹€λ₯΄μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

단지 λŒ€κ΄„ν˜Έλ₯Ό ν†΅ν•΄μ„œ λ°°μ—΄μ΄λΌλŠ” ν‘œμ‹œλ§Œ ν•΄ μ£Όλ©΄ λ©λ‹ˆλ‹€.

#include <iostream>

using namespace std;

int main() {
  size_t size{};
  cout << "Enter the size of array: ";
  cin >> size;

  double *arr_ptr = new double[size];
  for (size_t i{}; i < size; i++) {
    arr_ptr[i] = i + 1;
    cout << arr_ptr[i] << endl;
  }

  delete[] arr_ptr;

  cout << endl;
  return 0;
}

 

λ°°μ—΄μ—μ„œλ„ μ—­μ‹œ λ™μΌν•˜κ²Œ ν• λ‹Ήλœ λ©”λͺ¨λ¦¬λ₯Ό λ§ˆμ§€λ§‰μ— ν•΄μ œν•΄μ£Όμ–΄μ•Ό ν•©λ‹ˆλ‹€.

이것은 delete ν‚€μ›Œλ“œ μ˜†μ— λŒ€κ΄„ν˜Έλ₯Ό λΆ™μ΄λŠ” κ²ƒμœΌλ‘œ ν•  수 μžˆμŠ΅λ‹ˆλ‹€. (delete[])

 


 

ν—·κ°ˆλ¦¬λŠ” 뢀뢄을 ChatGPTμ—κ²Œ λ¬Όμ–΄λ³΄λ©΄μ„œ ν™•μΈν•œ 뢀뢄도 μžˆλŠ”λ°,

κ½€λ‚˜ μ •ν™•ν•˜κ³  μ •λ¦¬λœ 정보λ₯Ό μ œκ³΅ν•΄μ€λ‹ˆλ‹€.

ν—·κ°ˆλ¦¬λŠ” 뢀뢄에 λŒ€ν•΄μ„œ λ¬Όμ–΄λ³΄λŠ” 것도 쒋을 것 κ°™μŠ΅λ‹ˆλ‹€.

 

chatgpt의 정적 λ°°μ—΄ vs. 동적 배열에 λŒ€ν•œ μ„€λͺ