Notice
Recent Posts
Recent Comments
Link
«   2024/05   »
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
Archives
Today
Total
관리 메뉴

codingfarm

인스턴스의 생명주기 본문

Programming Language/C++

인스턴스의 생명주기

scarecrow1992 2021. 3. 19. 00:17
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
#include <vector>
#include <queue>
#include <iostream>
 
using namespace std;
 
class A {
public:
    priority_queue<int>* pq;
 
    A() : pq(new priority_queue<int>) {}
 
    ~A() {
        delete pq;
    }
 
};
 
int main(void) {   
 
    vector<A> va;
    va.push_back(A());
    delete va[0].pq;
 
    return 0;
}
cs

vector에 push_back을 하면서 A인스턴스의 생성자가 호출될것이며

main 함수의 종료와 함께 vector가 소멸하면서 A의 소멸자도 함께 호출될것이다.

그러므로 A의 인스턴스를 생명주기를 vector와 함께하기 위해 생성자에서 내부 포인터를 동적할당하며 소멸자에서 이 메모리를 해제하였다.

 

이론은 그럴싸해 보인다. 하지만 위 코드를 호출해보면 23번재 줄에서 에러가 발생한다.

이는 va에 들어가는 인스턴스의 생명주기에 관련된 문제이다.

vector에 들어가는 A의 인스턴스는 push_back의 매개변수인 생성함수 A()를 통해 값이 채워진다.

하지만 생성함수 A()의 생명주기 스코프는 push_back의 매개변수로 한정되어 있으므로.

push_back의 호출이 끝나는 순간, 곧바로 A의 소멸자가 호출되면서 pq의 메모리를 해제한다.

그래서 결국 vector 내의 인스턴스의 pq는 해제된 메모리르 참조하게 되는것이다.

 

 

 

 

'Programming Language > C++' 카테고리의 다른 글

friend  (0) 2021.04.15
enum과 enum class  (0) 2021.04.15
explicit  (0) 2021.04.15
함수 삭제(deleted function)  (1) 2021.02.28
#pragma 사용법  (0) 2020.11.20
Comments