반응형
객체의 동적 생성 및 반환
new는 클래스 크기의 메모리를 할당 받아 객체를 생성하며, 이때 생성자를 호출한다.
delete이 실행되면 객체를 반환하기 직전에 소멸자가 실행된다.
객체 생성과 객체 반환 예
1 2 3 4 5 6 | Circle *p = new Circle; Circle *q = new Circle(30); delete p; delete q; | cs |
delete 사용시 주의점
반환할 객체는 반드시 new를 이용해 할당 받은 동적 메모리에 존재하는 객체여야 한다.
다음 delete 문은 실행 오류를 발생 시킨다.
1 2 3 4 | Circle donut; Circle *p = &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 < 0) break; Circle *p = 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 *p = pArray; for (i = 0; i < 3; i++) { cout << p->getArea() << endl; p++; } delete [] pArray; } | cs |
실행 결과
동적으로 할당받은 메모리는 반드시 반환해야 하는가?
한 프로그램이 많은 메모리를 할당받는 다면, 힙 메모리가 부족하여 다른 프로그램이 할당 받을 수 없다. 그러므로 반환하는 것이 바람직하다.
* new를 이용해 할당한 메모리는 프로그램 종료시 자동으로 반환된다.
반응형
'Programming > C/C++' 카테고리의 다른 글
C/고수준 파일입출력/파일 기술자 (0) | 2017.10.26 |
---|---|
C++/동적 메모리 할당과 메모리 누수(memory leak) (0) | 2017.10.26 |
C++/동적 메모리 할당 및 반환 (0) | 2017.10.26 |
C++/CPPRESTSDK_VisualStudio에 설치 및 라이브러리 관리 (0) | 2017.10.25 |
C++/객체 배열 (0) | 2017.10.23 |