c++ - 如何释放 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;
}
}
解决方案
如何释放 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
.
推荐阅读
- python - networkx rescale_layout 返回 AttributeError: 'Graph' object has no attribute 'shape'
- java - fladdoodle.embed.mongo 总是从 Eclipse 中的 Spring Boot Main 应用程序开始,如何删除
- sql - Postgres:缺少表的 FROM 子句条目 - SQL
- amazon-ec2 - 我们可以在 Terraform 代码 (IaC) 中编写逻辑,例如使用 count.index[ ] 吗?
- c# - 如何获取 Xamarin CollectionView 项目的索引?
- java - Java SpringBoot应用程序获得不同的系统时间
- php - Laravel with() 和使用 LIKE 搜索不起作用
- angularjs - 设置输入默认值并能够在以后编辑它 - AngularJS
- java - 如何修改此代码以将随机文本插入控制台并为我反转它?
- c# - WPF:如何在没有任何灰色区域的网格中平均分配 2 个扩展器控件之间的可用高度