嵌套提升::shared_ptr use_count未更新

nested boost::shared_ptr use_count not updating

本文关键字:count 更新 use ptr shared 嵌套      更新时间:2023-10-16

我有一个嵌套的提升::shared_ptr,当被分配到另一个并超出范围时,它偶尔会被破坏。我发现除非我将指针复制到临时,否则use_count不会更新。该代码是不言自明的。在第一个 for 循环中,use_count不会更新,而在另一个循环中更新。

#include <vector>
#include <boost/shared_ptr.hpp>
#include <iostream>
using namespace std;

int main(int argc, char const *argv[])
{
  typedef int T;
  typedef std::vector<T> content_1d_t;
  typedef boost::shared_ptr<content_1d_t> storage_1d_t;
  typedef std::vector<storage_1d_t> content_2d_t;
  typedef boost::shared_ptr<content_2d_t> storage_2d_t;
  int dim1 = 10;
  int dim2 = 1;
  content_2d_t* content_1 = new content_2d_t();
  content_1->reserve(dim2);
  storage_2d_t storage_1(content_1);
  for (int i = 0; i < dim2; ++i)
  {
    storage_1->push_back(storage_1d_t(new content_1d_t(dim1)));
  }
  //content_2d_t* content_2 = new content_2d_t(dim2);
  storage_2d_t storage_2 = storage_1;
  for (int i = 0; i < dim2; ++i)
  {
    cout<< "use count before : "<< storage_1->operator[](i).use_count()<<endl;
    storage_2->operator[](i) = storage_1->operator[](i);
    cout<< "use count after: "<< storage_1->operator[](i).use_count()<<endl;
  }
  for (int i = 0; i < dim2; ++i)
  {
    cout<< "use count before : "<< storage_1->operator[](i).use_count()<<endl;
    storage_1d_t ref = storage_1->operator[](i);
    storage_2->operator[](i) = ref;
    cout<< "use count after: "<< storage_1->operator[](i).use_count()<<endl;
  }

  /* code */
  return 0;
}

输出

使用前计数 : 1

使用后计数:1

使用前计数 : 1

使用后计数:2

由于您显然storage_2d_t storage_2 = storage_1;,因此将元素直接分配回自身不应增加使用计数。

我第二个循环,你打印使用计数期间你持有临时副本(ref(。明确地说,您可以看到确实 - 正如预期的那样 - "之后"计数实际上并不高:

for (int i = 0; i < dim2; ++i) {
    cout << "use count before : " << (*storage_1)[i].use_count() << endl;
    {
        storage_1d_t ref = (*storage_1)[i];
        (*storage_2)[i] = ref;
        cout << "use count during: " << (*storage_1)[i].use_count() << endl;
    }
    cout << "use count after: " << (*storage_1)[i].use_count() << endl;
}

现在打印

use count before : 1
use count during: 2
use count after: 1

科里鲁现场观看


脑电波 你的意思是将storage_1深度克隆到storage_2吗?看来您对以下事实感到困惑:您的外部storage_2d_t也是一个共享指针,因此您通过引用引用相同的向量。

storage_2d_t storage_2 = boost::make_shared<content_2d_t>(*storage_1);
// or
storage_2d_t storage_2 = boost::make_shared<content_2d_t>(storage_1->begin(), storage_1->end());