C++11 自定义向量类中的动态内存重新分配

C++11 自定义向量类中的动态内存重新分配,c++11,memory-management,C++11,Memory Management,我的理解是,每次使用wordnew时,我必须使用delete,以避免内存泄漏。在我的示例中,在push_back()中,我使用new将动态内存重新分配给向量。我想,每当我使用push_back()时,我都会分配新的内存部分,而不会删除旧的。如果我是对的,有人能解释我,我应该如何删除我的记忆,以便将值保存在他们的地址中。如果我错了,请解释我的原因 class Vector { double* ptr; size_t size; size_t max

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

 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;
        }
    };
三件事:

  • 您希望使用
    newdouble[maxsize]
    (分配double数组),而不是
    newdouble(maxsize)
    (分配单个double值)
  • 新分配成功后,您希望从旧阵列复制数据(例如),否则将旧数据放在地板上
  • 成功分配新阵列并复制旧数据后,
    delete[]buf_ptr
    释放旧阵列的内存
  • 所有这些都可以通过更换此线路来修复:

                ptr = new double(max_size);
    
    以下几行:

                ptr = new double[max_size];
                std::copy(buf_ptr, buf_ptr + size, ptr);
                delete[] buf_ptr;
    
    确保在源文件的顶部包含


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

    注意
    new double(max\u size)
    不分配数组,它分配一个值为
    max\u size
    的双精度数组。要分配数组:
    new double[max\u size]
    。要取消分配该数组:
    delete[]
    ,而不是
    delete
    。我不使用std::copy,它可以在不“将旧数据放到地板上”的情况下工作。也许我误解了你的意思。好吧,我明白)我可以使用循环来复制数据,而不是使用std::copy吗?@VladimirSamoilenko:当然可以,但为什么要重新发明轮子呢
    std::copy
    应编译成与循环相同(或非常相似)的机器代码(如果您异常糟糕地实现了循环,则可能比循环更好),并且它使代码的意图立即变得显而易见;自我记录代码是一件好事。