gpt4 book ai didi

c++ - 内存未完全销毁-内存泄漏

转载 作者:太空宇宙 更新时间:2023-11-04 03:36:32 25 4
gpt4 key购买 nike

我在代码中使用 2D 数组,并且希望应用程序在使用 fun 之前和使用之后使用相同数量的内存。但不幸的是,这些值(value)观并不相同。当我在 fun 开头检查已用内存(来自代码 - 使用 /proc/self/statm,其中操作系统是 linux)时,它是一定数量的,而当我在 fun 函数中的 return ... 之前检查已用内存时,它与以前的数量不同。你能看到一些内存泄漏吗?我认为不必要时所有内存都会被破坏,但也许有问题:actualVertices = newVertices;。你觉得怎么样?

编辑:第一次检查 - 创建 Independentsets 之后,第二次检查在返回之前,所以 Independentsets 不是问题。除此之外,Independentsets 在 Main 之后被删除。问题出在 acrualvertices 和 newVertices 的内存中

编辑2:也许像这样进行内存检查:

double getUsedMemory()
{
int tSize = 0, resident = 0, share = 0;
ifstream buffer("/proc/self/statm");
buffer >> tSize >> resident >> share;
buffer.close();

return (double)(resident - share) / ToMBfromB * sysconf(_SC_PAGE_SIZE);
}

有问题吗?您知道以编程方式进行内存统计的更好方法吗?

int** CreateVertices(int row, int col) // Creating 2D array
{
int** nVertices = new int*[row];
for (int i = 0; i < row; ++i)
nVertices[i] = new int[col]();

return nVertices;
}

void DeleteVertices(int** tab, int rowCount) // Detroying 2D array
{
for (int i = 0; i < rowCount; ++i)
delete[] tab[i];

delete[] tab;
}

int* fun(..., int n)
{
int* independentSets;
int** actualVertices;
int** newVertices;

int actualVerticesRowCount = n;
int actualVerticesColCount = 1;

independentSets = new int[1 << n] ();
// first memory checking
actualVertices = CreateVertices(n, 1);

for (int i = 0; i < n; ++i)
{
independentSets[1 << i] = 1;
actualVertices[i][0] = i;
}

for (int el = 1; el < n; el++)
{
int col = el + 1;
int row = Combination_n_of_k(n, col);

newVertices = CreateVertices(row, col);
int l = 0;

for (int i = 0; i < actualVerticesRowCount; ++i)
{

// some computations...

for (int j = actualVertices[i][actualVerticesColCount - 1] + 1; j < n; ++j)
{

// some computations...

for (int k = 0; k < el; ++k)
newVertices[l][k] = actualVertices[i][k];

newVertices[l][el] = j;

l++;
}
}

DeleteVertices(actualVertices, actualVerticesRowCount);

if (el != n - 1)
actualVertices = newVertices;

actualVerticesRowCount = row;
actualVerticesColCount = col;
}

DeleteVertices(newVertices, actualVerticesRowCount);
// second memory checking
return independentSets;
}

最佳答案

我会使用 valgrind 并针对您怀疑存在内存泄漏的任何内容运行它。使用 statm (或 top 等)并不是判断程序泄漏的最佳方法——它可以告诉您程序大小正在增加,但这不一定是由于泄漏造成的。例如,分配模式可能会导致堆中出现碎片,这可能会迫使分配器增大堆以获得足够大的连续跨度来包含所请求的分配。我并不是说您的示例就是这种情况,但这只是不使用 statm 来断定存在内存问题的众多原因之一。

简单来说,valgrind 是一个查找泄漏的工具;使用它。

关于c++ - 内存未完全销毁-内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31370279/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com