IT 프로그래밍/객체지향프로그래밍

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

기술1 2024. 5. 17. 11:00
반응형

정적 메모리 할당 / stack

	int array[1000000]; //stack

이렇게 선언해주는 것, 우리가 일반적으로 쓰는 코드가 바로 정적메모리입니다. 이런 정적 메모리 할당은 stack에 들어가며 이것은 용량이 그렇게 크지는 않은데요.

 

동적 메모리 할당 / heap

	new int;

new int는 os에 4바이트 만큼 가져오면서 그 주소를 가져오는 것입니다. 그렇기 때문에 포인터로 받아야 하는데요.

int* ptr = new int;

*ptr = 7;

이런식으로 해줄 수 있는 겁니다. 배열 동적할당을 해주면 장점이 많이 생기기 때문에 이 동적 메모리 할당을 하는 것인데요. 이런식으로 os로부터 4바이트를 가져와서 할당을 해주는 것을 기억해주셔야 합니다.

 

할당하면서 초기화를 해줄 수 있는데요.

int main()
{
	int var;

	int* ptr = new int{ 7 };

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

	return 0;
}

이럴 경우 ptr은 주소, *ptr은 7이 나옵니다.

 

딥러닝같은 경우를 할 때 한번에 들어가지 않는 데이터를 작업해야 할 경우도 있습니다. 일부 작업을 하고 메모리에 돌려준 후 다시 메모리에 가져와야 할 경우도 있습니다. 

 

또한 여러 프로그램이 다 메모리를 쓰고 싶다고 하면 동시에 돌릴 수가 없으니 급한 애한테 줬다가 끝나면 메모리를 주는 방식으로 하면 더 효율적으로 컴퓨터를 사용할 수 있습니다. 메모리를 os에 돌려주는 방법은 delete를 씁니다.

delete ptr;

이런식으로 써주면 됩니다.

 

 

#include <iostream>
#include <string>
using namespace std;

int main()
{
	int var;

	int* ptr = new int{ 7 };

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

	delete ptr;

	cout << "After delete" << endl;
	cout << ptr << endl;
	cout << *ptr << endl;

	return 0;
}

이럴 경우 주소는 같게 나오지만 *ptr을 delete를 한 후에 보면 이상하게 값이 나오는 것을 보실 수 있을 겁니다.

 

	delete ptr;
	ptr = nullptr;

이런 식으로 nullptr을 넣어줘서 아무 의미 없는 값이라고 기록을 해두시면 됩니다. 그런 다음에

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

이런 식으로 쓰기 위해서 nullptr을 써주는 편인데요. 이렇게 기계적으로 프로그래밍 하는 것을 알고 계셔야 하는데요. 지금은 기계적으로 이런 식으로 코딩을 하고 있습니다. 

 

메모리를 할당받지 못할 때

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

	if (ptr)
	{
		cout << ptr << endl;
		cout << *ptr << endl;
	}

예외가 되면 nothrow 즉 nullptr을 반환해주는 코드입니다.

 

메모리 누수

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

이렇게 할 경우 계속해서 메모리가 생성이 되면서 문제가 발생하는데요. 이럴 경우 코딩에 큰 문제가 발생하기 때문에 이럴 경우가 절대로 없어야 합니다.

 

 

반응형