1. 동적 할당
필요성
동적 할당은 프로그램 실행 중 메모리를 동적으로 할당하고 해제하는 데 사용됩니다. 정적 할당(예시 : 배열)은 컴파일 시점에 크기를 결정하고, 프로그램이 실행되는 동안 크기를 변경하기 어렵습니다.
- 유연한 크기의 자료구조 필요성
- 프로그램 실행 중에 데이터 크기가 동적으로 변할 때, 동적 할당은 필수적입니다.
- 자원 효율성
- 정확한 메모리 양을 미리 예측하기 어려운 경우, 동적 할당은 자원을 효율적으로 사용할 수 있게 해줍니다.
메모리 영역
- 동적 할당의 경우 메모리 영역에서 Heap 영역에 할당됩니다.
- 프로그램 실행 중 (Runtime) 메모리를 동적으로 할당하고 해제하는데 사용되는 영역입니다.
종류
C++에서 동적 할당은 new 와 delete 키워드를 사용하는 방식, 스마트 포인터를 사용하는 방식으로 나뉩니다.
- malloc 할당
- new 와 delete 를 사용한 동적 할당
- new 를 사용하여 메모리를 동적으로 할당하고, delete 를 사용하여 메모리를 해제합니다.
- 스마트 포인터 동적 할당
- std::unique_ptr 및 std::shared_ptr 와 같은 스마트 포인터를 사용하여 메모리를 자동으로 관리합니다.
각 종류에 대한 예시
- malloc 할당
int main()
{
int* pInt = (int*)malloc(100);
}
malloc은 void* 반환형을 가지고 있다. 용량을 정의하면 그에 해당하는 용량을 가지고 있는 주소 만을 제공합니다.
즉 해당 공간을 어떻게 사용할 지는 사용자가 캐스팅(타입 변환)을 통해 정의합니다.
new 와 delete 를 사용한 동적 할당
#include <iostream>
int main() {
// int 형 동적 할당
int *intPtr = new int;
*intPtr = 42;
std::cout << "Value: " << *intPtr << std::endl;
// 배열 동적 할당
char *charPtr = new char[*intPtr];
// 동적으로 할당된 메모리 해제
delete intPtr;
delete[] charPtr;
return 0;
}
스마트 포인터를 사용한 동적 할당
#include <iostream>
#include <memory>
int main() {
// int 형 동적 할당 (std::unique_ptr 사용)
std::unique_ptr<int> intPtr = std::make_unique<int>(42);
std::cout << "Value: " << *intPtr << std::endl;
// 메모리는 스마트 포인터가 자동으로 해제
return 0;
}
2. 가변 배열
- 배열의 경우 꼭 필요한 만큼 크기를 지정하거나, 필요한 크기보다 조금 더 크게 지정 하는 게 좋습니다.
// .h, .hpp
class dynamicArray
{
private:
int* m_array;
int m_size;
int m_used;
public:
dynamicArray();
dynamicArray(int size);
~dynamicArray();
void popBack();
void pushBack(int data);
void print();
int &operator[](int index);
}
// dynamicArray.cc
dynamicArray::dynamicArray() : m_size(10), m_used(0)
{
m_array = new int[m_size];
}
dynamicArray::dynamicArray(int size) : m_size(size), m_used(0)
{
m_array = new int[m_size];
}
dynamicArray::~dynamicArray()
{
delete[] m_array;
}
void dynamicArray::popBack()
{
if(m_used == 0)
{
std::cout << "array is Empty" << std::endl;
return;
}
m_used--;
int* temp = new int[m_used];
for (int i = 0; i < m_used; ++i)
{
temp[i] = m_array[i];
}
delete[] m_array;
m_array = new int[m_size];
for (int i = 0; i < m_used; i++)
temp[i] = m_array[i];
delete[] temp;
return;
}
void dynamicArray::push_back(int data)
{
if(this->m_size > this->m_used)
{
this->m_array[this->m_used] = data;
}
else
{
int* temp = new int[this->m_size];
for (int i = 0; i < m_used; ++i)
{
temp[i] = this->m_array[i];
}
delete[] this->m_array;
this->m_array = new int[m_size * 2];
for (int i = 0; i < m_used; ++i)
{
m_array[i] = temp[i];
}
m_array[m_used] = data;
delete[] temp;
}
this->m_used++;
}
int& dynamicArray::operator[](int index){
return this->m_array[index];
}
'C++' 카테고리의 다른 글
C++ 템플릿 (0) | 2024.12.22 |
---|---|
C++ 자료구조 구현 이중 원형 연결 리스트 (0) | 2024.12.07 |
C++ 자료구조 구현 Red-Black Tree (0) | 2024.11.30 |
C++ 클래스 (0) | 2024.05.12 |
C++ 동적할당 (0) | 2024.05.04 |