본문 바로가기

C++

C++ 동적 할당

1. 동적 할당

필요성

동적 할당은 프로그램 실행 중 메모리를 동적으로 할당하고 해제하는 데 사용됩니다. 정적 할당(예시 : 배열)은 컴파일 시점에 크기를 결정하고, 프로그램이 실행되는 동안 크기를 변경하기 어렵습니다.

  1. 유연한 크기의 자료구조 필요성
    • 프로그램 실행 중에 데이터 크기가 동적으로 변할 때, 동적 할당은 필수적입니다.
  2. 자원 효율성
    • 정확한 메모리 양을 미리 예측하기 어려운 경우, 동적 할당은 자원을 효율적으로 사용할 수 있게 해줍니다.

 

메모리 영역

  • 동적 할당의 경우 메모리 영역에서 Heap 영역에 할당됩니다.
  • 프로그램 실행 중 (Runtime) 메모리를 동적으로 할당하고 해제하는데 사용되는 영역입니다.

 

종류

C++에서 동적 할당은 new 와 delete 키워드를 사용하는 방식, 스마트 포인터를 사용하는 방식으로 나뉩니다.

  1. malloc 할당
  2. new 와 delete 를 사용한 동적 할당
    • new 를 사용하여 메모리를 동적으로 할당하고, delete 를 사용하여 메모리를 해제합니다.
  3. 스마트 포인터 동적 할당
    • std::unique_ptr 및 std::shared_ptr 와 같은 스마트 포인터를 사용하여 메모리를 자동으로 관리합니다.

 

각 종류에 대한 예시

  1. 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