정적 메모리 할당 / 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;
}
이렇게 할 경우 계속해서 메모리가 생성이 되면서 문제가 발생하는데요. 이럴 경우 코딩에 큰 문제가 발생하기 때문에 이럴 경우가 절대로 없어야 합니다.
'IT 프로그래밍 > 객체지향프로그래밍' 카테고리의 다른 글
[c++]포인터와 참조 설명 (0) | 2024.05.17 |
---|---|
[따배시 6.12] 동적 할당 배열 (0) | 2024.05.17 |
[따배시 8.4] 생성자 멤버 초기화 목록 (0) | 2024.05.15 |
[8.3] 생성자 c++ (0) | 2024.05.15 |
[C++] 백준 4150번 피보나치 수 (0) | 2024.05.15 |