c++ - 在 C++ 中复制动态分配的数组
问题描述
我正在编写一个 DynamicArray 类并且被resize()
函数卡住了。当我删除 line 时,它按预期工作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
解决方案
您正在删除刚刚分配的内存。调整大小应该通过分配新内存从旧内存复制元素然后删除旧内存来工作。
像这样的东西
void resize() {
T *temp = new T[m_capacity / sizeof(T) * GROWTH_FACTOR];
std::copy(m_array, m_capacity / sizeof(T) + m_array, temp);
delete[] m_array;
m_array = temp;
}
我还会看看你如何将容量乘以sizeof(T)
,然后在你使用它的任何地方,你将容量除以sizeof(T)
. 如果您消除这两个操作,您将得到相同的结果。
推荐阅读
- c# - 从网站项目转换的 Web 应用程序成功构建但运行时错误
- pdfbox - 合并具有相同字体、资源的文档时减小 PDF 大小
- php - Symfony/PHP DateTimeZone 缺少时区
- jenkins - TFS -Jenkins 多分支项目
- c# - 如何在c#tcplistener中检测文件传输结束
- javascript - JavaScript 全屏相对于浏览器窗口,而不是监视器
- android - 使用recyclerView在android中进行分页
- ios - CMMotionActivityManager queryActivityStarting 数据在关闭之外不可用
- ios - Swift:使用默认值遵守协议
- highcharts - highmaps中的HighChart Boost模块不起作用