c++ stl复制函数正确的内存管理
Posted
技术标签:
【中文标题】c++ stl复制函数正确的内存管理【英文标题】:c++ stl copy function proper memory management 【发布时间】: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;
【问题讨论】:
你只是出于好奇才问的,不是吗?因为&floatVector[0]
的行为就像你的floatArray
。
当然可以,但为什么呢?
@honk。我实际上在某个地方发生了内存泄漏,我认为这可能是它,但我猜错了:(我也没有在我的项目中进行删除,而是将 floatArray 传递给了一个实例变量。
如果你想找到你的内存泄漏(和你使用的 linux)在调试模式下检查 valgrind。它会告诉你问题所在。
【参考方案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,是的,已更正!有许多可用的插入器。如果您想要一个好的用法,请查看我的问题的答案(我第一次了解它们的地方)***.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】:复制函数从不分配内存,但您必须为静态数据结构分配内存,但对于动态数据结构,它会自动分配内存。
这个过程并不好,但最好使用另一个向量而不是那个浮点数组
【讨论】:
以上是关于c++ stl复制函数正确的内存管理的主要内容,如果未能解决你的问题,请参考以下文章