C++11 自定义向量类中的动态内存重新分配
我的理解是,每次使用wordC++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
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
应编译成与循环相同(或非常相似)的机器代码(如果您异常糟糕地实现了循环,则可能比循环更好),并且它使代码的意图立即变得显而易见;自我记录代码是一件好事。