自定义向量类

时间:2017-03-07 22:50:45

标签: c++11 memory-management

我的理解,每当我使用单词new时,我必须使用delete,以避免内存泄漏。在我的示例中,在push_back()中,我使用new为我的向量重新分配动态内存。我想,每次当我使用push_back()时,我都会分配一部分新的内存,而不是delete。如果我是对的,有人可以解释我,我应该如何删除我的记忆,以便用他们的地址保存价值。如果我错了,请解释我的原因?

 class Vector {
        double* ptr;
        size_t size;
        size_t max_size;
        public:
        Vector(): size{0}, max_size{1} {
            ptr = new double(max_size);
        }
        ~Vector(){
            delete pointer;
        }
        void push_back(const double elem) {
            if (size+1 == max_size) {
                double* buf_ptr = ptr;
                max_size*=2;
                ptr = new double(max_size);
            }
            ptr[size] = elem;
            size+=1;
        }
    };

1 个答案:

答案 0 :(得分:1)

三件事:

  1. 您想使用new double[maxsize](分配双打数组),而不是new double(maxsize)(分配单个双倍值)
  2. 新分配成功后,您希望从旧数组中复制数据(例如with std::copy),或者您将旧数据丢弃在地板上
  3. 成功分配新阵列并复制旧数据后delete[] buf_ptr释放旧阵列的内存
  4. 所有这一切都可以通过替换这一行来解决:

                ptr = new double(max_size);
    

    这些行:

                ptr = new double[max_size];
                std::copy(buf_ptr, buf_ptr + size, ptr);
                delete[] buf_ptr;
    

    确保在源文件顶部#include <algorithm> new

    注意:您需要调整构造函数和析构函数,分别使用基于匹配数组的delete和{{1}}形式。