독개

[C++] 6.11 동적 할당 new와 delete

by #독개#

/*
우리가 만든 프로그램에 메모리가 할당되는 방식은 3가지다
1. Static Memory Allocation 정적 메모리 할당
	전역변수나 static 변수같이 프로그램 시작할때 할당받아서 끝날때까지 계속 가지고 있음
2. 자동메모리할당
	{ }내에 변수를 선언하거나 정적배열을 했을때 { } 밖으로 나가면 사라지고 OS로 반납하는 방식
3. Dynamic Memory Allocation 동적 메모리 할당
	메모리를 할당 받고 싶을때 받고 OS로 돌려주고 싶을때 돌려줄 수 있다

	프로그램이 종료될때 OS에게 모든 할당받은 메모리를 돌려주는데 그전에 프로그램과정속에 내가 원할때 돌려주는거

	이런 메모리들을 직접 선택해서 사용해줘야해서 c++이 어려운데 너무걱정안해도된다
	결국 우리는 잘만들어진 라이브러리(메모리관리도 잘해둠)을 가져다 쓸거기 때문이지
	이런것이 있고 원리를 이해하도록 하자
*/


#include <iostream>

using namespace std;

int main()
{
	//int array[1000000]; //오류가 발생한다 프로그래머 입장에서 바라볼땐 4메가 정도는 매우 작은 메모리이지만
	//우리가 메모리 할당받을때 받을수 있는게 stack영역 , heap영역인데 동적할당은 heap 이고 훨씬크다
	//생각해봐 main의 { }가 언제끝날지 모르는데 정적으로 계속 4메가바이트의 메모리를 쓰고있으면 이프로그램은 말도안되지 그래서 오류남

	int* ptr = new int; //new int는 int var;과 같은데 int에 맞는 4바이트 메모리를 하나 만든다음에 주소값을 반환해준다
	*ptr = 7;
	cout << ptr << endl;
	cout << *ptr << endl;
//int* ptr = new int(7); or new int{7}; 다가능


	delete ptr; //OS에게 메모리 돌려줌 돌려주면 ptr에 주소값은 계속 보관중인데 찾아가면 쓰레기값으로 바뀌어져있다
	//오호 ptr OS에 반납하고 나서는 이제 접근못하도록 바꼇네? 버전이 올라가면서 바뀐듯하다
	//원래는 이걸 방지하기위해서 delete하고난뒤에는 ptr = nullpt; 를 넣어줬었다
	cout << "After delete" << endl;
	//cout << ptr << endl;
	//cout << *ptr << endl;

///---------------------------------------------------------------------------

	//만약에 내가 큰메모리를 동적할당 했는데 컴퓨터가 안좋아서 메모리공간이 다른프로그램에서 다쓰고 있으면
	//원래는 내 프로그램이 꺼진다 그런데 꺼지지않고 그냥 넘어가도록

	int* ptr = new (std::nothrow) int{ 7 }; //이메모리가 할당이안되면 ptr에 null을 넣고 지나감


///----------------------------------------------------------------------------
	//메모리 누수 이런실수를 조심하자
	while (true)
	{
		int* ptr = new int;
		cout << ptr << endl;
		//delete ptr; 이걸빼먹어서 그럼
	}
	return 0;
}

 

 

 

 


🐱‍👓독하게 개발

블로그의 정보

독한 개발자

#독개#

활동하기