C언어에서는 malloc()과 free()를 써서 동적할당을 한다!
C++은 new와 delete를 사용해서 좀 더 간단해졌다!
Dynamic Allocating(동적할당) 이란, 프로그램이 실행되는 중에 이루어지는 메모리 할당이다.
코드 안에서 선언된 변수들은 컴파일 도중 메모리를 점유하는 할당이고 이는 프로그램이 실행되기 전에 할당된다. 반면, 동적 할당은 프로그램이 실행되는 도중 메모리를 그때그때 잡는다. 동적 할딩이 필요한 경우는 대체로 크기가 프로그램이 실행되는 중 결정되는 배열, 자료구조가 있을 때 등이다.
#include <iostream>
using namespace std;
int main()
{
int* p;
p = new int;
*p = 7;
cout << *p << endl;
delete p;
return 0;
}
'new' 뒤에 자료형을 쓰면 heap이라는 동적 메모리 전용 메모리에서 필요한 만큼 메모리를 확보해 그 주소를 넘겨준다.(동적 할당하는 메모리 타입은 포인터 타입과 같아야 한다.) int형이면 4byte의 메모리를 확보해 그 주소를 넘겨준다. 그걸 받는 p는 포인터여야 하고, 값을 할당하는 p 식으로 연산자를 사용해 접근해야 한다. (포인터 사용 그대로)
delete 사용법은 delete 포인터변수명 .
해당 포인터가 가리키는 동적 메모리를 해제해 주는 역할을 한다. (동적 메모리가 아니면 실행 중 에러가 난다.) eㅗㅇ적 메모리에 할당하고 deallocate하지 않으면 프로그램 실행 중 들어가 있는 값이 heap에 그대로 남아 프로그램 종료 후에도 남아있다. 값이 외부로 샐 수 있는 것을 메모리 누수(leak, leak)이라고 한다.
#include <iostream>
using namespace std;
int main()
{
int* p;
p = new int;
*p = 7;
cout << *p << endl;
delete p;
cout << *p <<endl;
return 0;
}
메모리 해제를 확인하기 위해 delete후에 p가 가리키는 곳의 값을 다시 한번 출력해보면 메모리가 해제되어 쓰레기값으로 메워졌음을 알 수 있다.
#include <iostream>
using namespace std;
class myclass
{
private:
int m, n;
public:
myclass(int m1, int n1) : m(m1), n(n1) {}
void print()
{
cout << "m:" << m << ",n:" << n << endl;
}
};
int main()
{
myclass *MCp;
MCp = new myclass(10, 20);
MCp->print();
delete MCp;
return 0;
}
class도 하나의 자료형처럼 취급해 쓰면 되는데, class의 생성자가 있을 경우, 생성자를 사용해 초기화를 할 수 있게 된다.
print()함수로 살펴보면 MCp가 포인터이므로 ->로 접근해야 한다. 구조체나 class가 멤버를 부를 때 왼쪽이 object이면 '.', 포인터이면 '->'연산자를 쓴다. delete연산도 다른 자료형과 똑같이 하면 된다.