c++ vector에 포인터를 삽입하니 정상적인 값이 입력 되지 않습니다.
조회수 1354회
이런식으로 트리 구조를 만드려고 합니다. 입력은 (D B), (G B) , (K,G), (J,A) 이런 식으로 알파벳이 2개씩 주어집니다. 오른쪽이 왼쪽 알파벳의 상위 노드 입니다.
코드 구현은 '노드이름-상위 노드' 로 class가 구성된 vector를 사용하였습니다.
#include <iostream>
#include <vector>
using namespace std;
class node {
private:
friend class node;
char num;
node* pnum = NULL; // 상위 node를 가르키는 포인터
public:
node(char num, node& p) : num(num), pnum(&p) {}
node(char num) : num(num){}
};
int main(void) {
vector<node> tree;
while (true) {
char n1, n2;
cin >> n1 >> n2;
tree.emplace_back(n1);
tree.emplace_back(n2, tree.back());
/*
emplace_back대신 아래 코드를 사용해도 같은결과입니다.
node a(n1);
tree.push_back(a);
node b(n2, tree.back());
tree.push_back(b);
*/
}
return 0;
}
처음에 cin으로 D(n1) 와 B(n2)가 주어지면 node : B-(pointer pnum =NULL)을 만들고 vector인 tree에 넣습니다. 그 뒤 node : D-(point pnum = &B) 을 만들고 vector인 tree에 넣는 식입니다. 하지만 vector tree에 저장된 D을 거쳐 상위노드 B로 가면 저장된 값 num이 쓰레기값으로 나오는데 원인을 모르겠습니다.
처음에 tree.emplace_back(n1)을 실행하면서 생성자가 호출된 상황입니다. this포인터를 보면 현재 Ox00ececa0에 node가 생성된 것을 확인 할 수 있습니다.
vector인 tree의 첫부분이 0x00ececa0을 가르키는것을 보면 정상적으로 저장된 상황입니다.
그러나 이후 vector에 num이 B이고 pnum(상위노드)에 tree0의 주소값을 저장하는 순간 0x00ececa0에서 0x00ecb3b8로 tree의 시작 주소가 변해 버렸습니다. 즉 pnum이 엉뚱한 주소를 가르키는 바람에 쓰레기값이 저장되는 상황이 벌어집니다.
즉 pnum이 바뀐 주소값에 따라 다시 가르키는 상황이 되어야하는데 해결 방법을 모르겠습니다...
댓글 입력