【问题标题】:Is it OK to use the addresses of std::vector elements as pointers?可以使用 std::vector 元素的地址作为指针吗?
【发布时间】:2014-03-03 17:33:25
【问题描述】:

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

ClassB Object(&ClassA[12]);

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

【问题讨论】:

  • 确实,当你对向量进行变异时,对向量元素的引用通常会失效。
  • @KerrekSB 谢谢。我是否正确地认为指针向量将是前进的方向?
  • @mga 我会考虑重写ClassB。原始指针从来都不是一个好主意。
  • @mga:使用boost::stable_vector,或者如果你拒绝使用boost,那么std::list<T>std::vector<std::unique_ptr<T>>,是的。
  • @mga 指针向量确实减轻了您对对象内存地址不变的直接担忧,但它只会打开另一个蠕虫罐,您必须小心删除向量中的每个元素在删除它们之前(假设它们是动态分配的)。更好的解决方案可能是vector<unique_ptr<ClassA>>,甚至是list<ClassA>

标签: c++ pointers stl stdvector


【解决方案1】:

如果vector 被调整大小(例如,如果push_back() 超过了向量的当前容量,因此需要分配更大的堆内存块),那么向量元素的地址会改变(因此,外部指针指向vector 的元素无效)。

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

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

例如,您可以拥有vector<unique_ptr<ClassA>>(因此,向量拥有动态分配的ClassA实例),并且您可以拥有原始 观察来自外部对象的指针(例如简单的ClassA*)。

【讨论】:

    【解决方案2】:

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

    如果您打算保留该指针,最好使用指针向量(或智能指针向量):

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

    【讨论】:

      猜你喜欢
      • 2020-10-30
      • 2011-03-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-19
      • 2016-02-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多