首页 > 解决方案 > 如何释放 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;
}
}

标签: c++c++11memory-managementheap-memory

解决方案


如何释放 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.


推荐阅读