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;

【问题讨论】:

你只是出于好奇才问的,不是吗?因为&amp;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:: 的情况下工作,因为dequestd 命名空间中,所以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复制函数正确的内存管理的主要内容,如果未能解决你的问题,请参考以下文章

STL中的内存分配器原理

C++ STL 内存管理:堆栈还是堆?

用于位图管理的 C++ STL 类

自定义C++ STL内存分配器

stl内存管理allocator(转)

STL内存管理器的分配策略