提问者:小点点

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

共1个答案

匿名用户

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