reserve 하지 않으면 addVector 함수에서 벡터 크기 증가하다가 주소를 옮길 수 있다. 이 경우 BBB 의 벡터 주소가 바뀌는 것이고, 이 주소를 가지고 있던 aaa 는 dangling pointer 를 들게 된다.
reserve 시 지정한 크기 내에서는 벡터의 크기가 변경되더라도 주소가 바뀌는 일이 일어나지 않는다.
reserve 전
reserve 후
Navigator of Tag
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 후
댓글 없음:
댓글 쓰기