可以使用std :: vector元素的地址作为指针吗?

时间:2014-03-03 17:33:26

标签: c++ pointers stl stdvector

考虑存在某些std::vector<ClassA>的情况,然后有另一个类的对象包含指向此向量元素的指针,例如:

ClassB Object(&ClassA[12]);

这是一个雷区,以防矢量调整大小等等?我应该改为std::vector<ClassA *>吗?

2 个答案:

答案 0 :(得分:4)

如果调整vector的大小(例如,如果push_back()超出了向量的当前容量,那么需要分配更大的堆内存块),那么向量元素的地址会发生变化(所以,对矢量元素的extern指针无效)。

如果将指针存储到向量内的ClassA,而不是ClassA的直接实例,那么指针在向量调整大小后仍然有效。

但是,请注意,在std::vector中存储拥有原始指针是一件非常糟糕的事情,也是泄漏的来源。
您应该存储拥有 智能指针,例如std::unique_ptr(用于唯一所有权语义)或std::shared_ptr(用于共享所有权语义)。

例如,您可以拥有vector<unique_ptr<ClassA>>(因此,向量拥有动态分配的ClassA实例),您可以拥有 raw 观察指针(例如简单ClassA*)。

答案 1 :(得分:2)

这是安全的,只要你没有存储该地址供以后使用(导致向量调整大小或以其他方式移动内存的东西会让你留下一个悬空指针)。

如果你打算抓住那个指针,那么最好有一个指针向量(或智能指针向量):

std::vector<std::shared_ptr<ClassA>> myVector;