我目前正在尝试创建类矢量容器。 它使用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;
}
}
如何释放new[]分配的内存?
使用delete[]
。 这必须在指针值丢失之前进行,并且必须在指针值的最后一次使用之后进行。 而且必须精确地完成一次。 并且除了数组new
返回的指针之外,不能对任何其他指针执行此操作。
问题是,试图在内部存储任何指针或任何包含指针的对象会导致内存损坏。
那么在如何使用对象方面就存在一个bug。 在模板中存储这样的对象本身应该不是问题。
所以我需要一种方法来释放使用的内存而不破坏里面的对象
这根本不可能。 没有存储,对象就不能存在(这里不适用的特殊情况除外)。
delete[] this->_data;
// so now we have an array of invalid pointers. fun time
为什么会有无效指针数组? 数组中的指针是否指向this->_data
?
实际上,您的数据结构没有稳定的元素地址。 扩展将使对元素的任何引用无效。 如果您需要这样的稳定性,那么您必须使用基于节点的数据结构,例如链表。
你的模板确实有一个限制,那就是它只被很好地定义为可复制的类。 也许你忽略了这个限制。 要摆脱这种限制很容易:只需使用std::copy
(或者可能使用std::move
从
,这取决于您需要的异常安全保证)而不是std::memcpy
。