【问题标题】:c++ stl copy function proper memory managementc++ stl复制函数正确的内存管理
【发布时间】:2011-07-25 18:20:27
【问题描述】:

就在下面的代码中,我需要用 new 为 floatArray 分配内存还是复制函数会为我分配内存?

以这种方式将常量向量复制到数组也可以吗?为什么?

vector<float> floatVector;
//filled floatVector here

float *floatArray = new float[floatVector.size()];
copy(floatVector.begin(),floatVector.end(),floatArray);          
delete[] floatArray;

【问题讨论】:

  • 你只是出于好奇才问的,不是吗?因为&amp;floatVector[0] 的行为就像你的floatArray。
  • 当然可以,但为什么呢?
  • @honk。我实际上在某个地方发生了内存泄漏,我认为这可能是它,但我猜错了:(我也没有在我的项目中进行删除,而是将 floatArray 传递给了一个实例变量。
  • 如果你想找到你的内存泄漏(和你使用的 linux)在调试模式下检查 valgrind。它会告诉你问题所在。

标签: c++ memory-management stl deep-copy


【解决方案1】:

std::copy不分配内存,你应该自己做。

【讨论】:

    【解决方案2】:

    如果您不想先分配数组,那么您可以使用back_inserter 迭代器将元素一个一个地推送到某些容器中。对于某些容器,这效率较低(我认为),但有时会非常方便。

    #include<iterator>
    #include<vector>
    #include<deque>
    
    std::vector<float> floatVector(10,1.0);
    std::deque<float>  floatDeque; //memory not allocated
    
    //insert elements of vector into deque.
    std::copy(floatVector.begin(), floatVector.end(), std::back_inserter(floatDeque));
    

    【讨论】:

    • 我以前从未见过 back_inserter,stl 中隐藏着很多不错的实用程序! back_inserter 应该是 std::back_inserter 吗?
    • @Greg,是的,已更正!有许多可用的插入器。如果您想要一个好的用法,请查看我的问题的答案(我第一次了解它们的地方)stackoverflow.com/questions/5424093/…
    • 技术上它可以在没有明确的std:: 的情况下工作,因为deque 在std 命名空间中,所以back_inserter 可以通过ADL 找到。也就是说,是的,您绝对应该对名称进行限定,以避免混淆并避免模糊的 ADL 问题。 :-)
    【解决方案3】:

    copy 不会为你分配,所以是的,你需要分配它。

    【讨论】:

      【解决方案4】:

      std::copy 使用参数赋值 ("=") 运算符或参数复制构造函数进行复制(这可能取决于实现,我现在不确定)。它只是遍历从 param.begin() 开始到 param.end() 的范围并执行以下操作:

      while (first!=last) *result++ = *first++;
      

      因此,您需要自己分配必要的内存。否则会产生未定义的行为。

      这样将常量向量复制到数组中可以吗?取决于你想做什么。一般来说,这很好,因为值是通过值而不是通过引用传递给目标的,因此不会破坏 const 正确性。

      例如,这很好用:

      std::vector<int> vec;
      vec.push_back(1);
      vec.push_back(2);
      const std::vector<int> constvec(vec);
      
      int *arrray = new int[2];
      std::copy(constvec.begin(),constvec.end(),arrray);
      

      【讨论】:

        【解决方案5】:

        复制函数从不分配内存,但您必须为静态数据结构分配内存,但对于动态数据结构,它会自动分配内存。

        这个过程并不好,但最好使用另一个向量而不是那个浮点数组

        【讨论】:

          猜你喜欢
          • 2015-02-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多