这是我的 previous问题 这是我的 C 代码的一部分:
#define PROD_NAME_MAX 256
struct Product
{
char name[PROD_NAME_MAX];
long int quantity;
long int category_id;
char deleted;
};
#define PROD_MAX 1000000
struct Product products[PROD_MAX];
struct Product *pProducts[PROD_MAX];
我在 Windows XP 和 PellesC 上工作。我明白我的 C 程序中没有足够的空间容纳全局数据。在任务管理器中,我可以看到“Mem Usage”增加到 268344k
并且进程崩溃了。如果 PROD_MAX
是 100000
,那么“Mem Usage”的另一个较小值也会发生崩溃。如果 PROD_MAX
较小,例如 50000
,则不会发生崩溃。我的系统有 1GB RAM
。我该怎么办?有没有简单易行的解决方案?
最佳答案
一般规则是避免消耗大量资源,除非您确定需要所有资源。
在现实生活中也是一样:如果你不确定吃完香蕉,你不会去买几公斤香蕉。
因此,例如,您应该malloc
每个单独的struct Product
。那么您能够处理的产品数量将取决于您的操作系统能够为您提供的(虚拟)内存量。
不要忘记测试 malloc
的失败,至少要有一些致命的错误信息:
struct Product *newprod = malloc(sizeof Product);
if (!newprod) {
perror("not enough memory for a Product"); exit(EXIT_FAILURE);
}
然后始终立即初始化 newprod
的每个字段。原则上,您应该养成在程序结束前释放
-ing 每个这样的内存区域的习惯。
如果您觉得您的特定计算机没有足够的资源来解决您的实际问题(您正在计算的现实世界问题),您将需要获得更多资源,这就变成了一种社交(例如要求您的经理购买更大的计算机)或经济问题(花很多钱购买大型服务器),或编程错误的症状(那么所需的资源就是开发时间)。
当然,“大量资源”的含义是主观的,并且在过去有所不同:在我十几岁的时候(1970 年代),1 兆字节的 RAM 是一个巨大的数量。如今,1 GB 的 RAM 成本并不高。但是您今天可能买不起 1 TB 的 RAM。 (也许当您退休时,家里可能有数 TB 的 RAM)。
一些著名科学家(也许是 Dijkstra)说过这样的话:“计算机科学是资源的数学”
也许 name
字段是一些 strdup(3) -ed 字段。您应该猜测这是否值得付出努力(您认为“平均”名称长度是多少?我不知道)并相应地调整您的代码。
同样,大指针数组 pProducts
本身可以动态分配堆(例如,您可以为该指针数组使用 realloc(3) 或 malloc
)。您最初可以为它分配 100 个指针,例如当它变满时将其增加一半 (newsize = 3*oldsize/2;
)。
阅读有关 C memory management 的维基页面, fragmentation , virtual memory , garbage collection , memory leak , memory pool , buffer overflow (并在谷歌上搜索“内存过度使用”)您可能会感兴趣。
关于c - C 中的全局数据空间不足,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24972623/