如何释放new []分配的内存?

格兰戈:

我目前正在尝试创建类似矢量的容器。它使用分配的内存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;
}
}
eerorika:

如何释放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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章