首页 > 解决方案 > 在 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 

标签: c++arraystemplatesmemory-management

解决方案


您正在删除刚刚分配的内存。调整大小应该通过分配新内存从旧内存复制元素然后删除旧内存来工作。

像这样的东西

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). 如果您消除这两个操作,您将得到相同的结果。


推荐阅读