본문 바로가기

Programming/C/C++

C++/객체와 객체 배열의 동적 생성 및 반환

반응형

객체의 동적 생성 및 반환

new는 클래스 크기의 메모리를 할당 받아 객체를 생성하며, 이때 생성자를 호출한다.

delete이 실행되면 객체를 반환하기 직전에 소멸자가 실행된다.


객체 생성과 객체 반환 예

1
2
3
4
5
6
Circle *= new Circle;
Circle *= new Circle(30);
 
delete p;
delete q;
 
cs



delete 사용시 주의점

반환할 객체는 반드시 new를 이용해 할당 받은 동적 메모리에 존재하는 객체여야 한다.

다음 delete 문은 실행 오류를 발생 시킨다.


1
2
3
4
Circle donut;
Circle *= &donut;
 
delete p;
cs


Circle 객체의 동적 생성 및 반환

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
#include <iostream>
using namespace std;
 
class Circle {
private:
    int radius;
public:
    Circle();
    Circle(int r);
    ~Circle();
    void setRadius(int r) { radius = r; }
    double getArea() { return 3.14*radius*radius;  }
};
 
Circle::Circle() {
    radius = 1;
    cout << "생성자 실행 radius = " << radius << endl;
}
 
Circle::Circle(int r) {
    radius = r;
    cout << "생성자 실행 radius = " << radius << endl;
}
 
Circle::~Circle() {
    cout << "소멸자 실행 radius =" << radius << endl;
}
 
 
int main() {
    Circle *p, *q;
    p = new Circle;
    q = new Circle(30);
    cout << p->getArea() << endl << q->getArea() << endl;
    delete p;
    delete q;
}
cs


실행 결과



Cirlce 객체의 동적 생성 및 반환 응용

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
40
#include <iostream>
using namespace std;
 
class Circle {
private:
    int radius;
public:
    Circle(); 
    Circle(int r);
    ~Circle();
    void setRadius(int r) { radius = r; }
    double getArea() { return 3.14*radius*radius; }
};
 
Circle::Circle() {
    radius = 1;
    cout << "생성자 실행 radius = " << radius << endl;
}
 
Circle::Circle(int r) {
    radius = r;
    cout << "생성자 실행 radius = " << radius << endl;
}
 
Circle::~Circle() {
    cout << "소멸자 실행 radius = " << radius << endl;
}
 
int main() {
    int radius;
    while (true) {
        cout << "정수 반지름 입력(음수 이면 종료) >> ";
        cin >> radius;
        if (radius < 0break;
        Circle *= new Circle(radius);
        cout << "원의 면적은 " << p->getArea() << endl;
        delete p;
    }
}
 
cs


실행결과


객체 배열의 동적 생성 및 반환


new를 이용하여 객체 배열을 생성하는 구문은 아래와 같다.

1
Circle *pArray = new Circle[3];
cs



* 객체 배열은 기본 생성자 Circle()이 호출되며 new를 이용해 호출할 때 매개 변수 있는 생성자를 호출 할 수 있는 방법은 문법적으로 없는 문장으로 컴파일 오류가 발생한다.

1
Circle *pArray = new Circle[3](30); 
cs



Circle 배열의 동적 생성 및 반환


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
40
41
42
43
44
45
#include <iostream>
using namespace std;
 
class Circle {
private:
    int radius;
public:
    Circle();
    Circle(int r);
    ~Circle();
    void setRadius(int r) { radius = r; }
    double getArea() { return 3.14*radius*radius; }
};
 
Circle::Circle() {
    radius = 1;
    cout << "생성자 실행 radius = " << radius << endl;
}
 
Circle::Circle(int r) {
    radius = r;
    cout << "생성자 실행 radius = " << radius << endl;
}
 
Circle::~Circle() {
    cout << "소멸자 실행 radius = " << radius << endl;
}
 
int main() {
    Circle *pArray = new Circle[3];
    int i;
    for (i = 0; i < 3; i++) {
        pArray[i].setRadius((i + 1* 10);
    }
    for (i = 0; i < 3; i++) {
        cout << pArray[i].getArea() << endl;
    }
    Circle *= pArray;
    for (i = 0; i < 3; i++) {
        cout << p->getArea() << endl;
        p++;
    }
 
    delete [] pArray;
}
cs


실행 결과


동적으로 할당받은 메모리는 반드시 반환해야 하는가?


한 프로그램이 많은 메모리를 할당받는 다면, 힙 메모리가 부족하여 다른 프로그램이 할당 받을 수 없다. 그러므로 반환하는 것이 바람직하다.

* new를 이용해 할당한 메모리는 프로그램 종료시 자동으로 반환된다.



반응형