2020년 7월 1일 수요일

c++ Vector 내용을 포인터로 써서 뜬 에러

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

struct AAA

{

AAA(int index) : index(index), vector(nullptr) {}

std::vector<std::byte>* vector;

int index;

};

class BBB

{

public:

BBB() = default;

~BBB() = default;

std::vector<std::vector<std::byte>>& getVectors() { return vectors; }

std::vector<std::byte>* addVector() { return &vectors.emplace_back(std::vector<std::byte>()); }

private:

std::vector<std::vector<std::byte>> vectors;

};

void main()

{

std::vector<AAA> aaas;

BBB bbb;

//bbb.getVectors().reserve(50);

for (int i = 1; i < 50; i++)

{

aaas.emplace_back(i);

auto vector = bbb.addVector();

vector->resize(i * 2);

aaas.back().vector = &bbb.getVectors()[i-1];

}

for (auto& aaa : aaas)

std::cout << aaa.vector->size() << std::endl;

}

reserve 하지 않으면 addVector 함수에서 벡터 크기 증가하다가 주소를 옮길 수 있다. 이 경우 BBB 의 벡터 주소가 바뀌는 것이고, 이 주소를 가지고 있던 aaa 는 dangling pointer 를 들게 된다.

reserve 시 지정한 크기 내에서는 벡터의 크기가 변경되더라도 주소가 바뀌는 일이 일어나지 않는다.

reserve 전

reserve 후

댓글 없음:

댓글 쓰기

List