5

我在一个更大的程序中有内存泄漏,我相信这是它的原因。

#include <stdlib.h>
#include <Windows.h>

typedef struct _struct{
    char* name;
} str;

int main() {
    system("PAUSE");

    str* Character = (str*)malloc(sizeof(str) * 20000);

    for(int i = 0; i < 20000; i++){
        Character[i].name = (char*)malloc(20000);   // Assign memory.
    }

    for(int i = 0; i < 20000; i++){
        free(Character[i].name);            // Free memory.
    }

    free(Character);
    system("PAUSE");
}

第一次暂停时的内存:~500K。

第二次暂停时的内存:~1.7M。

使用VS2012进行测试。有任何想法吗?

4

3 回答 3

4

您如何测量程序占用的内存量?我想到的一件事是您正在查看操作系统正在跟踪的工作集的大小。由于您分配并释放了大量内存,因此该集合的大小已经增加。有些操作系统会在一段时间后调整工作集的大小,有些则不会。我们在这里查看的是什么操作系统?

于 2013-06-10T10:22:49.117 回答
3

当您调用 时malloc,会在堆上分配内存。如果堆上剩余空间不足,程序将向操作系统请求更多内存并获取另一个块。从操作系统获取的内存通常在程序完成之前不会返回(尽管这取决于操作系统)。

通常不能单独使用程序大小来检查内存泄漏!使用 Valgrind 或类似工具来检查永远不会得到freed 的内存。

于 2013-06-10T10:28:45.640 回答
-1

str* 字符 = (str*)malloc(sizeof(str) * 20000);

在上面的行中,您通过查找结构的大小来分配内存。在这里,您将获得的结构大小将是指针宽度的大小,而不是字符的大小。

假设例如,如果指针宽度是 32 位,它将分配 (4 * 20000) = 80000 字节。

如果要分配 20000 个结构,

str* 字符 = (str*)malloc(sizeof(char) * 20000);

于 2013-06-10T11:55:10.833 回答