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;을 사용해서 누수를 방지해주어야 합니다.
'IT 프로그래밍 > C++' 카테고리의 다른 글
[따배시 6.14] 참조 변수 (0) | 2024.03.30 |
---|---|
[따배시 6.13] 포인터와 const (0) | 2024.03.29 |
[따배시 6.10] C언어 스타일의 문자열 심볼릭 상수, 포인터 사용의 유의점 (0) | 2024.03.29 |
[따배시 6.9] 포인터 연산과 배열 인덱싱 (0) | 2024.03.29 |
C++ [포인터 개념 정리] (0) | 2024.03.26 |