【问题标题】:Does std::vector::pop_back set the pointers of the objects in it to nullptr?std::vector::pop_back 是否将其中对象的指针设置为 nullptr?
【发布时间】:2015-04-29 01:10:29
【问题描述】:

std::vector::pop_back 是将其中对象的指针设置为nullptr 还是只是删除对象?

我看到我的向量的大小减小了,所以对象显然被删除了,但我想知道指针是否设置为 nullptr 还是我必须手动执行?

编辑:我根据包含指针的向量提出了这个问题。示例:vector<Bitmap*>

【问题讨论】:

  • 除了 size 成员减 1 之外,很可能什么也没有发生。向量的大小和向量的容量是 2 个不同的东西。
  • 你在说什么指针?听起来像 Java...
  • 你在说什么指针?如果您的向量包含指针,则在删除它们时不会对它们执行任何操作。如果它包含涉及指针的对象,则取决于其析构函数的作用。
  • 你为什么在乎?符合标准的程序将无法区分(您不打算访问索引超出范围的元素,是吗)?您“必须手动执行”是什么意思?谁在逼你?
  • 这个问题到底是关于什么的?从向量中弹出的对象立即被销毁。它不复存在。该对象内的某些“指针”是否设置为空有什么区别?反正你永远不会知道,因为对象不再存在。

标签: c++ stdvector nullptr


【解决方案1】:

来自http://en.cppreference.com/w/cpp/container/vector/pop_back

void pop_back();

删除容器的最后一个元素。
在空容器上调用 pop_back 是未定义的。
除了 back()end() 之外,没有任何迭代器或引用无效。

除此之外,我不会假设或推断任何事情。

【讨论】:

  • 好吧,在我搜索它之后,我也找到了它,这就是为什么我想知道它是否确实将它设置为 nullptr。这就是为什么我问的原因,我在其他任何地方都找不到。不过谢谢你的回答。
  • @JulianDeclercq 您还没有解释 什么 将被设置为 nullptr。也许一些示例代码将有助于澄清您的问题。
  • 我现在修好了 :D 谢谢大家
【解决方案2】:

http://www.cplusplus.com/reference/vector/vector/pop_back/

结束迭代器和任何指向被移除元素的迭代器、指针和引用都无效。 引用其他未删除元素的迭代器、指针和引用保证会继续引用它们在调用之前引用的相同元素。

如果您的向量直接包含对象,则调用对象的析构函数。 显然,如果您使用的是指针向量(具有所有权),您必须自己调用 delete。

std::vector<P*> myvector;
...
delete myvector.back();
myvector.pop_back();

【讨论】:

    【解决方案3】:

    从逻辑上讲,弹出对象的“析构函数”被调用。但是请注意,对于整数类型(并且指针是整数类型),“析构函数”是空操作。

    这意味着:

    这里将调用Thing::~Thing()

    std::vector<Thing> things;
    things.emplace_back({});
    things.pop_back();
    

    这里什么都不会被调用,你会有资源泄漏

    std::vector<Thing*> things;
    things.emplace_back(new Thing{});
    things.pop_back();
    

    这里会调用std::unique_ptr&lt;Thing&gt;::~std::unique_ptr&lt;Thing&gt;(),你不会有资源泄漏

    std::vector<std::unique_ptr<Thing>> things;
    things.emplace_back(std::make_unique<Thing>());
    things.pop_back();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-02-17
      • 1970-01-01
      • 2020-08-04
      • 1970-01-01
      • 2012-03-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多