일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- two pointer
- Brute Force
- MYSQL
- 이진탐색
- union find
- Dijkstra
- 다익스트라
- Hash
- 스토어드 프로시저
- Two Points
- Trie
- DP
- SQL
- binary search
- String
- Stored Procedure
- 그래프
Archives
- Today
- Total
codingfarm
인스턴스의 생명주기 본문
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