我想知道确定以下代码是否会产生内存泄漏的最佳方法,因为我知道你在使用它时必须释放内存,但同时这个数组或指向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;
}
答案 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
返回值。free
或delete
指针n
可能是unsigned
,使用它!! 答案 4 :(得分:0)
您正在分配n
整数,从0
索引到n-1
。但是,您正在从4循环到n
,这意味着您将分配索引n
并损坏内存。这就是free
导致错误的原因(当你调用它时会检查损坏)。
您必须修复内存损坏,然后放回free
电话。