728x90
반응형
동적 할당
프로그램의 성능을 좌우하는 것 -> 시간과 공간(메모리)
동적할당에서 '할당'은 메모리 할당을 의미한다.
동적할당의 정의는 프로그램 실행 중에 변수를 메모리에 할당하는 것을 의미한다.
기본자료형을 통해 동적할당을 하는 간단한 예시를 살펴보자.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
#include <iostream>
using namespace std;
int main() {
int* a = new int(5);
cout << a << endl;
cout << *a << endl;
*a = 10;
cout << a << endl;
cout << *a << endl;
delete a;//메모리 해제
//메모리 누수를 막기 위해 다 쓰면 delete 해주기.
//해제 해주면 다른 용도로 쓸 수 있음
}
|
cs |
보통 동적할당을 할 때는 new를 이용한다.
int a에 5가 저장되어 있고 그 주소값이 200번지라면 new가 반환하는 것은 a의 주소값, 즉 200번지이고
*a가 주소값(200번지)을 받는다.
메모리 공간을 다 이용한 후에는 반드시 delete로 메모리를 해제함으로써 메모리 누수를 막고, 그 공간에 다른 용도로 사용도 가능하다.
배열의 동적할당
동적할당은 배열에서 요긴하게 쓰이는데, 동적할당을 배우기 전에는 배열을 만들때 우선
최대한 크게 잡아놓고 시작했다. 이러면 공간의 낭비가 심해진다는 단점이 있다.
동적할당을 통해 내가 원하는 길이 만큼 배열을 할당해줄 수 있다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
#include <iostream>
using namespace std;
int main() {
int* arr;
int len;
cout << "동적할당할 배열의 길이 입력: ";
cin >> len;
arr = new int[len];
for (int i = 0; i < len; i++) {
arr[i] = len - i;
}
for (int i = 0; i < len; i++) {
cout << arr[i] << endl;
}
delete[] arr;
}
|
cs |
arr = new int[len];
--> int형 배열을 len만큼의 길이로 만들고, 이 배열의 0번째 주소값을 arr에 반환된다.
이때부터 포인터였던 arr이 배열처럼 쓸 수 있게 된다.
delete[] arr;
--> delete arr이 아니라 delete[]arr 인것이 중요하다. delete arr을 하면 arr[0]만 삭제되는데
배열자체의 메모리를 해제해주고 싶으면 delete []arr 로 해야한다ㅣ
객체에 대한 동적할당
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
|
#include <iostream>
using namespace std;
class Vector2 {
public:
Vector2():x(0),y(0){
cout << this << " : Vector2()" << endl;
}
Vector2(const float x, const float y) :x(x), y(y) {
cout << this << " : Vector2(const float x, const float y)" << endl;
}
~Vector2() {
cout << this << ": ~Vector2()" << endl;
}
float GetX()const { return x; }
float GetY()const { return y; }
private:
float x;
float y;
};
int main() {
Vector2 s1 = Vector2();
Vector2 s2 = Vector2(3, 2);
Vector2* d1 = new Vector2();
Vector2* d2 = new Vector2(3, 2);
cout << "(" << d1->GetX() << "," << d1->GetY() <<")"<< endl;
cout << "(" << d2->GetX() << "," << d2->GetY() <<")"<< endl;
delete d1;
delete d2;
}
|
cs |
아래 코드가 객체에 대한 동적할당을 해준 것이다.
Vector2* d1 = new Vector2();
Vector2* d2 = new Vector2(3, 2);
출력값을 보면
동적할당해준 d1,d2가 먼저 소멸되고, 이후에 정적할당된 s1,s2가 소멸되는 것을 확인할 수 있다
728x90
반응형
'C++ > 기초(두들낙서)' 카테고리의 다른 글
[C++기초] 깊은복사, 얕은 복사 - 대입연산자 (0) | 2022.01.16 |
---|---|
[C++기초] 깊은복사와 얕은 복사 ,복사생성자 (0) | 2022.01.15 |
[C++기초] 클래스 연습문제 (0) | 2022.01.15 |
[C++기초] 연산자 오버로딩 (0) | 2022.01.14 |
[C++ 기초] 멤버 메서드 활용 (0) | 2022.01.14 |
댓글