如果 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。
【讨论】:
你实际上没有回答这个问题。答案是他可以使用malloc
或realloc
,因为它们都可以用来分配新的内存块。【参考方案2】:
这里发生了两件事。第一个涉及失败的malloc()
的行为。 malloc()
要么工作,并返回一个指向内存块的指针,要么分配内存失败,并返回一个空指针。 (请注意,在第二种情况下,没有分配内存,而不是说,“尽其所能”并分配一些小于请求数量的值。)
第二个是realloc和malloc在错误情况下可能的相似之处。
realloc()
需要一个指向先前由malloc()
分配的内存块的指针。但是,如果指针恰好是null
,那么realloc()
的工作方式与malloc()
完全相同,并且分配了一个新块。 (如果realloc()
调用失败,则返回一个空指针,就像malloc()
。)
参考:c++ malloc、c++ realloc
【讨论】:
以上是关于如果 Malloc 无法分配 X 字节,我是使用 Realloc 还是再次使用 Malloc? C++的主要内容,如果未能解决你的问题,请参考以下文章