【发布时间】:2020-11-09 19:54:54
【问题描述】:
我目前正在尝试创建类似矢量的容器。它使用new[] 分配的内存作为它的基础。当我需要扩展数组时会出现问题。我用new[] 分配了更大的内存块,然后将memcpy 旧内存分配到那里,delete[] 旧内存。问题是,试图在其中存储任何指针或任何包含指针的对象都会导致内存损坏。所以我需要一种方法来释放使用的内存而不破坏里面的对象
编辑:一些代码来理解问题:
template<typename T>
class myvector
{
private:
T* _data;
size_t _size, _capacity;
static constexpr float multiplier = 1.5;
public:
void expand()
{
size_t e_size = sizeof(T);
size_t old_capacity = this->_capacity;
this->_capacity = (unsigned long)(float(this->_capacity) * myvector::multiplier);
T *tmp = new T[this->_capacity];
memcpy(tmp, this->_data, e_size * (old_capacity));
// this will destroy all the objects inside the container
// which will result in destruction of any allocated memory
delete[] this->_data;
// so now we have an array of invalid pointers. fun time
this->_data = tmp;
}
}
【问题讨论】:
-
我认为您的问题的标题有点误导,因为您已经知道如何使用
delete[]并且它会破坏数组的内容。也许提供一些代码来说明问题,但我认为问题在于你如何复制内存。您不应该复制,而是在调整大小时移动构建对象。 -
也许可以分享一些代码,因为这将有助于理解你的工作
-
"然后将旧内存 memcpy 到那里" - 这不适用于非 POD C++ 类型,因为它不会正确调用构造函数/析构函数。
-
memcpy只能与trivially-copyable objects 一起使用。它不适用于具有用户定义的析构函数(或构造函数,或赋值运算符)的对象。 -
“所以我需要一种方法来释放内存而不破坏内部对象”不,你不需要,你只需要修复对象从旧存储移动到新存储的错误方式。经典的 XY 问题
标签: c++ c++11 memory-management heap-memory