在调用 pop_back 之前,我是否需要 delete/free 在 std::deque 中动态分配数据(例如 bytearray 或 std::vector)?

Do I need to delete/free dynamically allocated data (e.g. bytearray or std::vector) within a std::deque before I can call pop_back?

据我了解,std::deque 的 push_back() 会复制我输入的数据。因此,当我引用动态数据(例如动态字节数组或 std::vector) 它只复制对它的引用。现在我尝试了解是否必须在 std::deque pop_back() 之前 delete/free 我动态分配的数据?给出了 C++11。希望有人能帮助我!下面我有两个场景作为代码示例:

情景一:


  typedef struct mystruct{
    uint8_t* data; 
    //other fields may be here
  } mystruct_t;

  mystruct_t my;
  my.data = new uint8_t[3];
  my.data[0] = 'A';
  my.data[1] = 'B';
  my.data[2] = 'C';
  std::deque<mystruct_t> d;
  d.push_back(my);
  // ...
  // Need to delete/free data here, before d.pop_back()?
  d.pop_back();

场景二:


  typedef struct mystruct{
    std::vector<uint8_t> data;
    // other fields may be here
  } mystruct_t;

  mystruct_t my;
  my.data.push_back('A');
  my.data.push_back('B');
  my.data.push_back('C');

  std::deque<mystruct_t> d;
  d.push_back(my);
  // ...
  // Need to delete/free data here, before d.pop_back()?
  d.pop_back();

好的,因为没有人回答,考虑到新的发现,我尝试自己回答:

我在无休止的循环中对上面显示的代码进行了一些运行时测试,同时将 1 MB 数据放入字节数组/向量中,有/没有释放它并在 运行.[=12 时监视系统内存行为=]

测试场景一:


struct mystruct{
  uint8_t* data; 
  //other fields may be here
};

int j = 0;
while(1){

  j++;

  mystruct my;
  my.data = new uint8_t[1000000]; // approx. 1 MB
  for(int i=0;i<=1000000;i++){
    my.data[i] = 'A';
  }      
  std::deque<mystruct> d;
  d.push_back(my);
  // TBD: Need to delete/free data here, before d.pop_back()?
  // delete[] d[0].data;
  d.pop_back();

  Log(LogLevel::kInfo) << "pushing and popping ... " << j;

}

测试场景二:


  typedef struct mystruct{
    std::vector<uint8_t> data;
    // other fields may be here
  } mystruct_t;

  std::deque<mystruct_t> d;

    int j = 0;
    while(1){

      j++;

      mystruct my;      
      for(int i=0;i<=1000000;i++){  // approx. 1 MB
        my.data.push_back('A');
      }      
      std::deque<mystruct> d;
      d.push_back(my);

      // TBD: Need to delete/free data here, before d.pop_back()?      
      //  for(int i=0;i<=1000000;i++){  // approx. 1 MB
      //    d[0].data.pop_back();
      //  }  

      d.pop_back();

      Log(LogLevel::kInfo) << "pushing and popping ... " << j;

    }

结果是:

  • 场景I使用的内存增加很多,并且在未删除bytearray的情况下启动后不久就崩溃了。如果在每次迭代中都删除字节数组,则一切都稳定。

  • 在场景 II 中,内存使用保持稳定,即使没有从 vector<> 中弹出元素。所以,这似乎是在内部以某种方式完成的。在弹出双端队列之前从向量中弹出每个元素的场景 II 也是稳定的。

补充说明:场景二比场景一慢很多,尤其是每次都弹出向量中的所有元素时。

如果有人能解释为什么弹出托管双端队列元素时向量分配的内存似乎被释放,我们将很高兴。