关于《C++ Primer(第4版)习题解答》习题18.1源代码中resize实现的内存重分配问题
C++ Primer第四版习题18.1为实现自己的Vector类的版本包括成员函数reserve,resize等:
《C++ Primer(第4版)习题解答》中给出的习题18.1源代码中resize是这样实现的:
//Vector类实现源码
#include <memory>
#include <cstddef>
using namespace std;
........;
........;
template <class T> void Vector<T> ::reallocate()
{
ptrdiff_t size = first_free -elements;
ptrdiff_t newcapacity = 2 * max(size,1);
//alloc为allocator类的一个对象
T* newelements = alloc.allocate(newcapacity);
uninitialized_copy(elements,first_free,newelements);
for(T *p = first_free;p != elements;)
alloc.destroy(--p);
if(elements)
alloc.deallocate(elements,end - elements);
elements = newelements;
first_free = elements + size;
end = elements + newcapacity;
}
........;
........;
template <class T>
void Vector<T> ::resize(const size_t n)
{
size_t size = first_free -elements;
size_t capacity = end - elements;
if(n > capacity)
reallocate();
uninitialized_fill(elements + size,elements + n,t());
else if (n > size)
uninitialized_fill(elements + size,elements + n,t());
else
for(T *p = first_free;p != elements + n;)
alloc.destroy(--p);
first_free = elements + n;
}
.........;
.........;
..........
疑惑:若调用resize函数时给的参数n较大的,若n大于当前size的两倍(即n > newcapacity),
按reallocate()的内存分配策略新的Vector容量为newcapacity = 2 * max(size,1),那超出
newcapacity的内存未分配,使用uninitialized_fill(elements + size,elements + n,t());
进行构造填充时elements + n肯定大于newcapacity,不会造成访问越界吗?
是不是《C++ Primer(第4版)习题解答》中给出的习题18.1源代码中resize是这样实现有错误?
请各位大侠指点指正!!!
[解决办法]
不是很明白啊,resize和参数z的关系函数里已经说的很清楚了,哪怕n大于当前的size的100倍,他也先判断的是if(n > capacity) 成立的话,会先重新分配内存的,这时,重新分配内存后,capacity又比n大了,总之capacity总会比n大的,还有一个问题,这个“进行构造填充”,不准确吧,是重新分配一块大的内存,来放以前的原素,以前小的内存delete了,
[解决办法]
自己打开<vector>头文件,看stl的vector的实现代码。
[解决办法]
你可以看vector的实现,ms是内存分配器完成的
[解决办法]