gpt4 book ai didi

c++ - std::allocator 在重新分配后不保留旧分配的项目

转载 作者:太空狗 更新时间:2023-10-29 21:26:34 25 4
gpt4 key购买 nike

我正在尝试实现一个分配内存块的 Vector 类,如果它需要包含更多项,最终会重新分配它。
我正在使用 std::allocator 来执行此操作:

#include <iostream>
#include <stdexcept>

using namespace std;

template <class T>
class Vector
{
private:
T* data;
allocator<T> data_all;
int length;
int _size;
static const int block_size=10;
void init()
{
length=0;
_size=block_size;
data=data_all.allocate(block_size,NULL);
}
public:
Vector()
{
init();
}
int size() const
{
return length;
}
void push_back(T item)
{
length++;
if(length > _size)
{
_size+=block_size;
data=data_all.allocate(_size,data);
}
data_all.construct(&data[length-1],item);
}
T& operator[] (int i)
{
if(i<0 || i>= length)
throw out_of_range("The index is out of vector range");
return data[i];
}
};

int main(int argc, char** argv)
{
Vector<int> v;
for(int i=0; i<20; i++)
v.push_back(i);
for(int i=0; i<v.size(); i++)
cout << v[i] << "\t";
return 0;
}

问题是之前分配的项目没有保留,它打印:

0   0   0   0   0   0   0   0   0   0   10  11  12  13  14  15  16  17  18  19  

代替:

0   1   2   3   4   5   6   7   8   9   10  11  12  13  14  15  16  17  18  19  

为什么会有这种行为?在 C++ 中有没有一种方法可以像在 C 中那样使用 realloc 重新分配连续的项目?

最佳答案

allocate 的第二个参数只是一个提示,分配器可以用来尝试返回接近旧内存的新内存,但被 忽略std::allocator 并且对于类似 vector 的容器来说相当无用,因为所有元素无论如何都彼此靠近,因为它们在一个连续的 block 中。

您似乎期望它复制现有数据。它不会。您必须通过从旧内存块复制到新内存块来做到这一点。

您还泄漏了旧内存。您需要取消分配它。

你想要这样的东西:

void push_back(const T& item)
{
if (length == _size)
{
T* new_data = data_all.allocate(_size+block_size);
// N.B. if any of the following copies throws new_data will be leaked
std::uninitialized_copy(data, data+length, new_data);
std::destroy(data, data+length);
data_all.deallocate(data, _size);
data = new_data;
_size+=block_size;
}
data_all.construct(&data[length++],item);
}

关于c++ - std::allocator 在重新分配后不保留旧分配的项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11058662/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com