c ++ stl copy函数适当的内存管理

时间:2011-07-25 18:20:28

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

在下面的代码中我是否需要为floatArray为new分配内存,或者copy函数是否会为我分配内存?

也可以这样将常量向量复制到数组中吗?为什么?

vector<float> floatVector;
//filled floatVector here

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

5 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分: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));

答案 2 :(得分:0)

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

答案 3 :(得分:0)

std :: copy拷贝使用参数赋值(“=”)运算符或参数拷贝构造函数(这可能是依赖于实现的,我现在不确定)。它只会在从param.begin()开始到param.end()的范围内迭代,并执行以下操作:

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

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

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

例如,这很好用:

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);

答案 4 :(得分:0)

复制功能永远不会分配内存,但你必须为静态数据结构分配内存,但对于动态数据结构,它会自动分配内存。

并且这个过程并不好,但最好使用另一个向量而不是那个floatarray