删除、释放还是解除分配?
Posted
技术标签:
【中文标题】删除、释放还是解除分配?【英文标题】:Delete, Free, or Deallocate? 【发布时间】:2016-03-08 04:19:20 【问题描述】:我遇到了一个问题,我在堆栈上使用了太多内存。我正在使用几个大数组,我只需要在我的代码中的步骤之间。基本上我需要知道如何释放创建为的数组变量所使用的内存:
float arrayName[length][width];
【问题讨论】:
考虑动态分配数组,而不是尝试释放数组。 我会更关心如何更有效地首先分配内存,而不是通过自动变量。 你的堆栈有多少内存? Ubuntu 15.10 (64) 默认为每个线程 8 MB。如果你有 n MBytes,你是如何决定你使用“太多”的? 50% 90% 的人需要,或者可能难以理解崩溃? 【参考方案1】:要有意释放一些自动存储(“堆栈”上的项目),您可以执行以下操作 - 基本上您只需限制变量的范围
更改代码:
//...
float arrayName[length][width];
// ...
将代码更改为:
//...
float arrayName[length][width];
// use arrayName here
//... still in-scope
// scope limit
// all of arrayName released from stack
// stack is available for other use, so try
uint32_t u32[3][length][width];
// use u32 here
//... still in-scope
// scope ended
// all of u32 released from stack
// better yet, use std::vector or another container
std::vector<uint32_t> bigArry;
注意:向量使用有限数量的堆栈(在我的系统上为 24 个字节), 不管你往里面放了多少元素!
【讨论】:
在我的一个游戏中,我使用了“typedef std::vector你应该使用向量来处理这样的事情。它是 C++ 标准库的一部分,在大多数实现中都进行了非常优化。当向量超出范围时,向量占用的内存将自动释放。因此,您永远不必自己释放内存。
使用向量的另一个好处是您不必担心堆栈空间不足,因为向量占用的所有“数组”内存都位于程序的堆上。
例如http://en.cppreference.com/w/cpp/container/vector/vector
除此之外,如果您认为您的程序内存永远不够用,那么您应该考虑使用磁盘作为另一种存储机制。数据库以这种方式工作。他们将大部分数据存储在磁盘上。
【讨论】:
@Downvoter 您能否评论一下您为什么不赞成这个答案?【参考方案3】:您不需要任何特殊声明。
如果数组是具有自动存储持续时间的局部变量,则数组将在函数返回或退出范围时释放,或者如果它是静态变量(在函数外部声明),则在退出程序时释放。
【讨论】:
我想他说的是单个函数中有几个大堆栈数组的情况,他想释放函数其余部分没有使用的那些【参考方案4】:如果您遇到堆栈内存不足的情况,您可能希望在堆上分配内存。在这种情况下,您需要新建数组。
float** my_array = new float* [rowCount];
for(int i = 0; i < rowCount; ++i)
my_array[i] = new float[columnCount];
// and delete it later
for(int i = 0; i < rowCount; ++i)
delete [] my_array[i];
delete [] my_array;
【讨论】:
不,你不想要这个。那里有columnCount
可能的内存泄漏。在考虑如何修复它们之前,请注意 Curious 已经有一个更简单的建议,没有内存泄漏。以上是关于删除、释放还是解除分配?的主要内容,如果未能解决你的问题,请参考以下文章