std::vector::pop_back是否将其中对象的指针设置为nullptr?
Does std::vector::pop_back set the pointers of the objects in it to nullptr?
std::vector::pop_back
是将其中对象的指针设置为nullptr
还是直接删除对象?
我看到矢量的大小减小了,所以对象显然被删除了,但我想知道指针是否设置为 nullptr
还是我必须手动设置?
编辑:我根据包含指针的向量问了这个问题。示例:vector<Bitmap*>
.
来自http://en.cppreference.com/w/cpp/container/vector/pop_back
void pop_back();
删除容器的最后一个元素。
在空容器上调用 pop_back
是未定义的。
除了 back()
和 end()
之外,没有迭代器或引用是无效的。
除此之外我不会假设或推断任何事情。
逻辑上,弹出对象的'destructor'被调用。但是请注意,对于整数类型(指针是整数类型),'destructor' 是空操作。
这意味着:
此处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<Thing>::~std::unique_ptr<Thing>()
会被调用,不会有资源泄露
std::vector<std::unique_ptr<Thing>> things;
things.emplace_back(std::make_unique<Thing>());
things.pop_back();
http://www.cplusplus.com/reference/vector/vector/pop_back/
结束迭代器和引用已删除元素的任何迭代器、指针和引用均无效。
引用其他未删除元素的迭代器、指针和引用保证继续引用它们在调用之前引用的相同元素。
如果您的向量直接包含对象,则调用对象的析构函数。
显然,如果您使用的是指针向量(具有所有权),则必须自己调用 delete。
std::vector<P*> myvector;
...
delete myvector.back();
myvector.pop_back();
std::vector::pop_back
是将其中对象的指针设置为nullptr
还是直接删除对象?
我看到矢量的大小减小了,所以对象显然被删除了,但我想知道指针是否设置为 nullptr
还是我必须手动设置?
编辑:我根据包含指针的向量问了这个问题。示例:vector<Bitmap*>
.
来自http://en.cppreference.com/w/cpp/container/vector/pop_back
void pop_back();
删除容器的最后一个元素。
在空容器上调用 pop_back
是未定义的。
除了 back()
和 end()
之外,没有迭代器或引用是无效的。
除此之外我不会假设或推断任何事情。
逻辑上,弹出对象的'destructor'被调用。但是请注意,对于整数类型(指针是整数类型),'destructor' 是空操作。
这意味着:
此处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<Thing>::~std::unique_ptr<Thing>()
会被调用,不会有资源泄露
std::vector<std::unique_ptr<Thing>> things;
things.emplace_back(std::make_unique<Thing>());
things.pop_back();
http://www.cplusplus.com/reference/vector/vector/pop_back/
结束迭代器和引用已删除元素的任何迭代器、指针和引用均无效。 引用其他未删除元素的迭代器、指针和引用保证继续引用它们在调用之前引用的相同元素。
如果您的向量直接包含对象,则调用对象的析构函数。 显然,如果您使用的是指针向量(具有所有权),则必须自己调用 delete。
std::vector<P*> myvector;
...
delete myvector.back();
myvector.pop_back();