如果 Malloc 无法分配 X 字节,我是使用 Realloc 还是再次使用 Malloc? C++

Posted

技术标签:

【中文标题】如果 Malloc 无法分配 X 字节,我是使用 Realloc 还是再次使用 Malloc? C++【英文标题】:If Malloc Fails To Alloc X Bytes Do I Use Realloc Or Use Malloc Again? C++ 【发布时间】:2017-10-28 01:13:51 【问题描述】:

我一直在读一本关于 C++ 内存管理的书,它有很多细节并且很好地解释了事情。但是我有一个我一直在研究的程序,它必须处理一些非常大的向量或数组。 不过我很困惑。我决定尝试分配内存以防万一。

我的问题是,如果我尝试malloc() 一定数量的数据,就会出现问题。如果我想尝试再次执行malloc() 并分配更少的数据,我是使用realloc() 还是再次使用malloc()?我认为这听起来像是一个愚蠢的问题,但是因为第一个 malloc() 会失败,所以它根本不会被 malloced ... ???这意味着您应该仍然可以使用malloc() 吗?

那么...我应该使用哪个,或者我根本不使用以下任何一个?

BYTE *allocptr;
allocptr = (BYTE*)malloc(2500000);
if (!allocArray)

    allocptr = (BYTE*)malloc(1000000);
 
// program code
free(allocptr);

或者我应该使用realloc() 来尝试更少量的字节... 如果第一个 malloc() 失败,而不是再次尝试 malloc()

BYTE *allocptr;
allocptr = (BYTE*)malloc(2500000);
if (!allocptr)

    allocptr = (BYTE*)realloc(allocptr, 1000000);
 
// program code
free(allocptr);

我问这个问题的原因是因为如果第一个 malloc() 未能分配 2,500,000 个字节,allocptr 不会等于 NULL...如果 allocptr 等于 NULL,我不能使用 malloc() on它而不是 realloc(),因为我认为 realloc() 不能接受等于 NULL 的指针。

【问题讨论】:

您似乎对realloc 的作用感到困惑。如果您从未获得过内存块,则无法更改其大小。 @tkausl 是的,我在我正在阅读的书中读到了这样一个事实,即您不能重新分配等于 NULL 或类似内容的指针,感谢您提供的帮助,几乎可以回答这个问题。 realloc 采用 2 个参数(一个指针和一个大小),因此您的代码将无法工作。 @JohnnyMopp 哦,我什至没有注意到,我只是输入了它而没有从我的代码中复制它。谢谢。我会编辑它。 【参考方案1】:

Realloc 更改分配的块或内存的大小(或分配一个新的并复制旧内容)。例如,当您分配 5 个字节的内存时,您会使用它,但后来注意到您还需要 5 个字节。

在你的情况下,malloc 失败,你从来没有得到任何内存块开始,所以没有什么可以重新分配,所以你会使用malloc

注意:正如@DavidSchwarz 提到的,您可以使用 realloc,但这相当于在第一个参数为 NULL 时调用 malloc。

【讨论】:

你实际上没有回答这个问题。答案是他可以使用mallocrealloc,因为它们都可以用来分配新的内存块。【参考方案2】:

这里发生了两件事。第一个涉及失败的malloc() 的行为。 malloc() 要么工作,并返回一个指向内存块的指针,要么分配内存失败,并返回一个空指针。 (请注意,在第二种情况下,没有分配内存,而不是说,“尽其所能”并分配一些小于请求数量的值。)

第二个是realloc和malloc在错误情况下可能的相似之处。 realloc() 需要一个指向先前由malloc() 分配的内存块的指针。但是,如果指针恰好是null,那么realloc() 的工作方式与malloc() 完全相同,并且分配了一个新块。 (如果realloc() 调用失败,则返回一个空指针,就像malloc()。)

参考:c++ malloc、c++ realloc

【讨论】:

以上是关于如果 Malloc 无法分配 X 字节,我是使用 Realloc 还是再次使用 Malloc? C++的主要内容,如果未能解决你的问题,请参考以下文章

重新分配错误但不是malloc?

malloc分配内存的结构

内存分配方面的分页

malloc函数详解

malloc函数详解

为啥尽管我在变量中使用 malloc 分配更多内存,但当我打印变量的大小时,它仍然显示更少的内存/字节? [复制]