class A{
public:
A(){cout<<"constructor"<<endl;}
~A(){cout<<"destructor"<<endl;}
};
int main()
{
{
//case 1
vector<std::shared_ptr<A>> vec;
vec.reserve(1);
vec[0] = std::make_shared<A>();
}
// Not destructor
{
//case 2
vector<std::shared_ptr<A>> vec;
vec.emplace_back(std::make_shared<A>());
}
// Called destructor
return 0;
}
为什么vec
在寿命结束时,其内的元素在情况1中不能删除。结果
如果我们不保留vec,而是将元素放回vec,这是可行的。
TL;DR:我想这是一个拼写错误,你想调用resize(1)
而不是reserve(1)
,但我想解释一下,因为我知道如何容易混淆这两个函数。
std::vector
具有容量(可以使用的总插槽(和大小(实际使用的插槽数(。
reserve((将增加容量,即为更多元素腾出空间,但不会增加大小。这就是resize((的工作:
vec.reserve(1); // capacity >= 1, size = 0!
如果索引>=,则访问矢量是越界的矢量的大小,与容量无关,因此
vec[0] = std::make_shared<A>();
超出范围并导致未定义的行为。(索引0>=大小0(