c++ - 在C++中复制动态分配的数组

标签 c++ arrays templates memory-management

我正在编写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 

最佳答案

您正在删除刚分配的内存。调整大小应该通过从旧内存分配新的内存复制元素,然后删除旧内存来进行。
像这样

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++ - 在C++中复制动态分配的数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62965594/

相关文章:

c++ - 将文件中的数据读入数组 C++ 时循环跳过行

c++ - OpenCV 从 B/W 转换为 RGB

C++:如何执行泛型的深度克隆

javascript - 将构造的类名传递给 JQuery

C++ 模板 type_trait enable_if 类是映射

c++ - 从模板函数返回的 const 相关名称,const 去哪里了?

c++ - 指向类成员函数的指针

python - 在 numpy 数组中查找多个值的行索引

arrays - 查询 JSON key :Value Pairs in AWS Athena

jquery - 错误 : view. hlp(...) 不是 jsrender 中的函数