IT 프로그래밍/C++

[따배시 6.11] 메모리 동적할당 new와 delete

기술1 2024. 3. 29. 15:01
반응형
int array[1000000];

정적에 할당하는 메모리는 stack에 들어갑니다. 이 stack에는 메모리가 작습니다. 동적으로 할당하는 메모리는 hip에 들어가며 이 hip에는 메모리가 큽니다. 

 

이렇기 때문에 코딩을 할 때는 정적메모리를 잘 활용하셔야 합니다. 큰 메모리를 만들려면 동적 메모리와 친숙해지셔야 합니다. 

int *ptr = new int;

os로부터 받아온 4byte의 메모리를 그대로 사용할 수 있는 것입니다. 

	int* ptr = new int{ 7 };

	cout << ptr << endl;
	cout << *ptr << endl;

이런 식으로 만들어줄 수도 있습니다. 이렇게 하면 7하고 7의 주소가 나오게 됩니다. 

 

	int* ptr = new int{ 7 };

	cout << ptr << endl;
	cout << *ptr << endl;

	delete ptr;

 

이렇게 하면 ptr에 있는 것을 컴퓨터로 돌려주는 것입니다. os가 이 프로그램에게 어디에 있는 걸 얼마나 줬었다는 것을 기억하고 있다면 delete 없이도 정상적으로 자동으로 걷어갑니다.

 

delete는 os가 걷어가기 전에 알아서 반납하는 것이라고 생각해주시면 됩니다. 

	ptr = nullptr;

이 포인터에는 쓸모있는 주소가 없어요 라는 null값을 기록해두는 것입니다. 

 

그래서 나중에

if(ptr != null ptr)
{
	cout << ptr << endl;
    cout <<*ptr << endl;
}

이런식으로 해주시면 됩니다. 

#include <iostream>

using namespace std;



int main()
{
	int* ptr = new int{ 7 };

	cout << ptr << endl;
	cout << *ptr << endl;

	delete ptr;
	ptr = nullptr;

	cout << "After delete" << endl;
	if (ptr != nullptr)
	{
		cout << ptr << endl;
		cout << *ptr << endl;
	}

	return 0;
}

 

메모리를 할당받지 못했을 때


	int* ptr = new (std::nothrow) int{ 7 };

이런식으로 만들어두면 오류를 발생시키지 않습니다. 

 

new 가 실패하면 nothrow를 통해 nullptr이 되는 것입니다. 

 

메모리 누수


int main()
{
	//memory leak;

	while (true)
	{
		int* ptr = new int;
		cout << ptr << endl;
	}
	return 0;
}

위의 경우 무한루프 안에서 계속해서 동적으로 정수를 할당하고 있습니다. 각 반복에서 new int를 사용하여 메모리를 동적으로 할당받고 할당된 메모리 주소를 출력한 후에는 위 주소에 대한 포인터가 더 이상 참조되지 않습니다.

 

그러나 동적으로 할당된 메모리는 반환되지 않고 게속 사용되고 있어 누수가 발생합니다. 위의 경우 delete ptr;을 사용해서 누수를 방지해주어야 합니다. 

반응형