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