0

据我了解 std::deque 的 push_back() 复制我输入的数据。因此,当我引用动态数据(例如动态字节数组或 std::vector)时,它只复制对它的引用. 现在我尝试了解是否必须在 std::deque 的 pop_back() 之前删除/释放动态分配的数据?给出了 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();

4

1 回答 1

0

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

我在无限循环中对上面显示的代码进行了一些运行时测试,同时将 1 MB 的数据放入 bytearray/vector 中,有/没有释放它,并在运行时监控系统内存行为。

测试场景一:


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 增加了很多使用的内存,并且在未删除字节数组时启动后不久崩溃。如果在每次迭代中删除字节数组,则一切工作稳定。

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

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

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

于 2019-10-10T06:40:44.277 回答