【问题标题】:Copying dynamically allocated array in C++在 C++ 中复制动态分配的数组
【发布时间】: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


【解决方案1】:

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

类似的东西

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

【讨论】:

  • 此外,您还应该编写一个析构函数来清理数组: DynamicArray::~DynamicArray() { delete[] m_array; }
  • 是的,你的类还需要一个析构函数、一个复制构造函数、一个复制赋值运算符,最好是移动构造函数和移动赋值运算符。但我想这只是正在进行中。做这一切绝对是一个很好的学习工具。
  • 那么 m_capacity 和 m_size 应该是 ints 吗?我在某处读到它们应该是 size_t,但这只会在代码中造成很大的混乱
  • 在标准库中,它们是size_t,但在我看来,如果您喜欢这样的界面,将它们作为int 并没有错。
猜你喜欢
  • 1970-01-01
  • 2015-06-23
  • 2018-09-06
  • 2010-10-02
  • 1970-01-01
  • 1970-01-01
  • 2018-09-26
  • 1970-01-01
  • 2014-08-19
相关资源
最近更新 更多