为什么矢量中的共享ptr没有用保留删除

  • 本文关键字:ptr 删除 保留 共享 c++
  • 更新时间 :
  • 英文 :

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(

相关内容

  • 没有找到相关文章

最新更新