【问题标题】:How to free low heap memory in a function?如何释放函数中的低堆内存?
【发布时间】:2022-01-14 12:45:06
【问题描述】:
 bool containsDuplicate(vector<int>& nums) {
    int n=nums.size();
    int* counter=new int[n];
    for(int i=0;i<n-1;++i){
        ++counter[i];
    }
    for(int i=0;i<n;++i){
        if(int i>1) return true;
    }
    return false;
}

如你所见,我申请了一个堆空间'counter'; 所以,我想知道是否需要释放堆内存,如何释放堆内存?谢谢。

【问题讨论】:

  • if(int i&gt;1) 看起来不像有效的 C++。如果你的编译器毫无怨言地吃掉了它,就把它扔掉,换一个更好的。
  • ++counter[i]; 不会像 counter 尚未初始化一样。请用minimal reproducible example红色How to Ask;除非您询问编译错误,否则代码应该编译。为什么要混合 std::vector 和 c 数组?是的,你需要delete [] counter;
  • 为什么不使用std::vector&lt;int&gt; counter;
  • 你已经在你的程序中使用了vector,但是你没有在本来可以使用它的地方使用它:std::vector&lt;int&gt; counter (n);。然后所有的问题都解决了。
  • 此外,即使您解决了所有问题,此代码也无法找到像 {1, 10 ,1} 这样简单的重复项,除非您假设 nums 仅包含从 0 到的整数n-1.

标签: c++ heap-memory


【解决方案1】:

首先直接回答您的问题,然后继续阅读:

我想知道是否需要释放堆内存

是的,你应该这样做。

如何释放堆内存?

delete [] counter;

注意[] 是必不可少的,因为counter 是一个动态数组。对于使用new 分配的非数组内存,应省略[](请参阅cppreference.com)。

代码中的问题

  1. if(int i&gt;1) 不是有效的 C++ 语法。应该只是if(i&gt;1)

  2. counter 没有初始化,所以结果不可靠。

  3. 第一个循环不计算 values 的出现次数,而是 indices 的出现次数,因此(在修复之前的问题后)返回值将始终为 false

  4. 如果上述所有条件都已修复,则此函数只能处理 {0, n-1} 范围内的值,因为其他值不是 counter 数组的有效索引。请改用set。这也使得关于内存管理的问题变得无关紧要,因为该集合将在函数退出时被销毁。

建议的解决方案

一旦决定使用一套,事情就会变得容易得多。可以给集合构造函数一个范围(nums 向量),一旦构建了集合,就可以将其大小与向量的大小进行比较:

#include <vector>
#include <set>
using namespace std;

bool containsDuplicate(vector<int>& nums) {
    set<int> uniques(nums.begin(), nums.end());
    return uniques.size() < nums.size();
}

【讨论】:

  • 您可以强调[] 部分,这对于用于动态数组而不是用于单个对象很重要。
  • 添加了一个短语。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-07
  • 2022-09-27
  • 1970-01-01
  • 2016-07-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多