【发布时间】:2020-11-07 22:42:17
【问题描述】:
我正在编写一个 DynamicArray 类,但遇到了resize() 函数。当我删除行 delete[] temp 时,它按预期工作。但是当我不这样做时,它似乎只复制了最后两个元素。我在这里错过了什么吗??
#include <iostream>
#include <initializer_list>
template <typename T, int N>
class DynamicArray
{
private:
T *m_array;
size_t m_capacity = N * sizeof(T); // Capacity of the array
size_t m_size; // Number of added elements
public:
const int GROWTH_FACTOR = 2;
DynamicArray(std::initializer_list<T> elements) : m_size(elements.size()) {
m_array = new T[m_capacity / sizeof(T)];
std::copy(elements.begin(), elements.end(), m_array);
}
DynamicArray() : m_size(0) {
m_array = new T[m_capacity / sizeof(T)];
}
void resize() {
T *temp = new T[m_capacity / sizeof(T) * GROWTH_FACTOR];
std::copy(m_array, m_capacity / sizeof(T) + m_array, temp);
m_array = temp;
delete[] temp;
}
void print() {
for (int i = 0; i < m_size; i++){
std::cout << m_array[i] << " ";
}
std::cout << std::endl;
}
};
int main() {
DynamicArray<int, 5> array = { 1, 22, 3, 4 };
array.print();
array.resize();
array.print();
return 0;
}
输出:
1 22 3 4
0 0 3 4
【问题讨论】:
-
还没有给你造成问题,但你需要实现rule of 3
-
初始容量设置为模板参数有点奇怪。尤其是容量会在阵列的整个生命周期内发生变化。容量实际上并不是动态数组类型的一部分,所以我认为它不应该是模板参数。如果您希望用户能够设置它,只需将其设为
GROWTH_FACTOR之类的常量或构造函数参数即可。
标签: c++ arrays templates memory-management