此代码是否会导致内存泄漏或是否干净?

时间:2012-03-05 11:13:13

标签: c++ memory-leaks

我想知道确定以下代码是否会产生内存泄漏的最佳方法,因为我知道你在使用它时必须释放内存,但同时这个数组或指向int的指针当函数返回时超出范围,那么我是否释放它并不重要?

但在这种特殊情况下,根据Visual Studio 2010中的microsoft调试器,我无法在不中断堆的情况下释放内存。

为了学习如何最好地解决这个问题,请介绍一下检查内存泄漏的方法。

提前致谢

#include <iostream>
#include <algorithm>
#include <cmath>

using namespace std;
int sieve(int n)
{
  int *a = (int *) malloc(sizeof(int) * n);
  int max = floor(sqrt((double)n));
  int p = 2;
  memset(a,0,sizeof(int) * n);
  while(p<=max)
  {
    for(int i = 2 * p; i <= n; i+= p)
      a[i] = 1;
    while(a[++p]) /* Empty */ ;
  }
  while(a[n]) n--;
  /* free(a); */ // free our array as we are done with it. but it generate a heap error
  return n;
}
int main(void)
{
  cout << sieve(100) << endl;
  system("pause");
  return 0;
}

5 个答案:

答案 0 :(得分:3)

这一行可能是导致错误的原因:

for(int i = 2 * p; i <= n; i+= p)

在此处循环,i小于或等于n。但是作为所有数组,索引必须从0到(size - 1)。您应该为该数组分配一个额外的条目:

int *a = (int *) malloc(sizeof(int) * (n + 1));

答案 1 :(得分:3)

程序中存在内存泄漏,因为您没有释放分配的内存。 如果你打算使用“new”然后使用“delete”运算符,那么在这里使用“free”,因为你已经使用了malloc和incase 在return语句之前尝试释放内存。 您还可以使用valgrind工具查找程序中的内存泄漏 请查看此url以获取更多信息。

此工具可帮助您找出程序中的内存泄漏。

答案 2 :(得分:2)

是的,您现有的程序会泄漏内存。

通常,如果要动态分配内存(在C中使用malloc,或在C ++中使用new),并且您没有使用智能指针,则需要使用{{释放内存分别为1}}或free

在您的特定测试程序中,它在调用delete方法后立即退出,这意味着操作系统将自动释放已分配的内存。

另请注意,您似乎在sieve()中编写了C代码:

  • C++是分配内存的C方式。如果必须使用原始指针,则应在C ++中使用malloc
  • 更好的是,使用像new这样的标准库容器,它会自动为您管理内存。

答案 3 :(得分:1)

更重要的事情:

您使用n分配了int *a = (int *) malloc(sizeof(int) * n); int。如果您想要访问此信息,则必须从0开始,直到n-1。在行while(a[n]) n--;中,您超出了已分配的内存部分的范围。也许是核心!!!!

而且,如果所有a[n]值都不同,会发生什么?减少n直到达到负值。那这个呢?您可以使用a[n]访问n < 0值。也许是另一个核心。

请记住,这是C / C ++。它执行你所写的所有内容,所以要小心!!!

一般编程技巧:

  • 验证所有阵列限制。
  • 验证malloc返回值。
  • 总是freedelete指针
  • 使用正确的类型:n可能是unsigned,使用它!!

答案 4 :(得分:0)

您正在分配n整数,从0索引到n-1。但是,您正在从4循环到n,这意味着您将分配索引n并损坏内存。这就是free导致错误的原因(当你调用它时会检查损坏)。

您必须修复内存损坏,然后放回free电话。