删除、释放还是解除分配?

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 GameBoard_t”。注意这个向量的单一维度,但 Gamboard 是 2 暗淡。我只是使用一个函数从 row,col 坐标计算游戏板索引 ...“静态内联 size_t gbIndx(int row, int col, int MAXCol) return ((row * MAXCol) + col); 。非常简单而且非常快。此外,许多对游戏板的访问不使用 row,col 而是简单地遍历整个向量,例如:screenUpdate()、clearGameBoard() 在我回答的范围限制大括号之间,请注意,您只需要一个函数或方法来启用许多 KLOC 的代码来访问“大”数据存储。 (但请记住通过引用传递它;)【参考方案2】:

你应该使用向量来处理这样的事情。它是 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 已经有一个更简单的建议,没有内存泄漏。

以上是关于删除、释放还是解除分配?的主要内容,如果未能解决你的问题,请参考以下文章

iOS 设备上 ObjC 对象的安全解除分配

MCSession 需要很长时间才能解除分配

用于抽象资源分配/释放的惯用 Go

C 和 C++:释放已分配指针的一部分

AFHTTPSessionManager 未解除分配

删除/释放由 malloc 分配并由 new [重复] 重用的内存