【发布时间】:2021-05-16 15:35:27
【问题描述】:
在程序中如下:
#include <vector>
#include <memory>
#include <iostream>
int main()
{
std::vector<std::shared_ptr<int>> v{ std::make_shared<int>() };
for ( auto i = v.capacity() - v.size() + 1; i-- > 0; )
v.push_back( v.back() );
for ( auto i = v.capacity() - v.size() + 1; i-- > 0; )
v.insert( v.end(), --v.end(), v.end() );
for ( const auto & p : v )
{
std::cout << ( p ? "valid_ptr" : "null" ) << std::endl;
}
return 0;
}
一些编译器输出(Visual Studio、ellcc):
valid_ptr
valid_ptr
valid_ptr
而其他(gcc、clang、icc)输出:
valid_ptr
valid_ptr
null
假设使用push_back 复制最后一个元素总是正确工作,即使当向量达到其容量并需要重新分配时,这是否正确?
同时使用insert 复制最后一个元素是未定义的或特定于实现的行为?
【问题讨论】:
-
不是
insert是显示代码中未定义的行为。这是push_back。 -
为什么不分别运行
push_back()和insert()?
标签: c++ vector stl undefined-behavior