为什么使用Alloca()不被视为良好做法?

为什么使用Alloca()不被视为良好做法?

alloca()在堆栈上分配内存,而不是在堆上分配内存,如malloc()..所以,当我从例程返回时,内存就被释放了。因此,实际上这解决了我释放动态分配内存的问题。释放通过malloc()是一个主要的头痛,如果某种程度上错过会导致各种记忆问题。

为什么使用alloca()尽管有上述特点,但还是气馁?


DIEA
浏览 1565回答 3
3回答

手掌心

答案就在man页(至少在linux):返回值-Alloca()函数返回指向分配空间开头的指针。如果分配导致堆栈溢出,则程序行为未定义。这并不是说它不应该被使用。我从事的一个开放源码软件项目广泛使用它,只要您不滥用它(alloca),这很好。一旦你超过了“几百字节”的标记,就该使用它了。malloc而是朋友。您可能仍然会遇到分配失败,但至少您将有一些失败的迹象,而不是只是吹出堆栈。

料青山看我应如是

我最难忘的错误之一是与一个内联函数有关,该函数使用alloca..它表现为程序执行过程中随机点的堆栈溢出(因为它在堆栈上分配)。在头文件中:void&nbsp;DoSomething()&nbsp;{ &nbsp;&nbsp;&nbsp;wchar_t*&nbsp;pStr&nbsp;=&nbsp;alloca(100); &nbsp;&nbsp;&nbsp;//......}在实现文件中:void&nbsp;Process()&nbsp;{ &nbsp;&nbsp;&nbsp;for&nbsp;(i&nbsp;=&nbsp;0;&nbsp;i&nbsp;<&nbsp;1000000;&nbsp;i++)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DoSomething(); &nbsp;&nbsp;&nbsp;}}所以所发生的是编译器的内联DoSomething函数和所有堆栈分配都发生在内部。Process()函数,从而将堆栈放大。在我的辩护中(我不是那个发现问题的人,我不得不去找一个无法解决的高级开发人员),这是不对的。alloca,它是ATL字符串转换宏之一。所以教训是-不要用alloca在你认为可能是内联的函数中。

ibeautiful

旧的问题,但没有人提到,它应该被替换为可变长度数组。char&nbsp;arr[size];而不是char&nbsp;*arr=alloca(size);它在标准的C99中,在许多编译器中作为编译器扩展而存在。
打开App,查看更多内容
随时随地看视频慕课网APP