为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C
DIEA 2019-06-21 17:01:11
为什么使用Alloca()不被视为良好做法?alloca()在堆栈上分配内存,而不是在堆上分配内存,如malloc()..所以,当我从例程返回时,内存就被释放了。因此,实际上这解决了我释放动态分配内存的问题。释放通过malloc()是一个主要的头痛,如果某种程度上错过会导致各种记忆问题。为什么使用alloca()尽管有上述特点,但还是气馁?
查看完整描述

3 回答

?
手掌心

TA贡献1942条经验 获得超3个赞

答案就在man页(至少在linux):

返回值-Alloca()函数返回指向分配空间开头的指针。如果分配导致堆栈溢出,则程序行为未定义。

这并不是说它不应该被使用。我从事的一个开放源码软件项目广泛使用它,只要您不滥用它(alloca),这很好。一旦你超过了“几百字节”的标记,就该使用它了。malloc而是朋友。您可能仍然会遇到分配失败,但至少您将有一些失败的迹象,而不是只是吹出堆栈。


查看完整回答
反对 回复 2019-06-21
?
料青山看我应如是

TA贡献1772条经验 获得超8个赞

我最难忘的错误之一是与一个内联函数有关,该函数使用alloca..它表现为程序执行过程中随机点的堆栈溢出(因为它在堆栈上分配)。

在头文件中:

void DoSomething() {
   wchar_t* pStr = alloca(100);
   //......}

在实现文件中:

void Process() {
   for (i = 0; i < 1000000; i++) {
     DoSomething();
   }}

所以所发生的是编译器的内联DoSomething函数和所有堆栈分配都发生在内部。Process()函数,从而将堆栈放大。在我的辩护中(我不是那个发现问题的人,我不得不去找一个无法解决的高级开发人员),这是不对的。alloca,它是ATL字符串转换宏之一。

所以教训是-不要用alloca在你认为可能是内联的函数中。


查看完整回答
反对 回复 2019-06-21
?
ibeautiful

TA贡献1993条经验 获得超5个赞

旧的问题,但没有人提到,它应该被替换为可变长度数组。

char arr[size];

而不是

char *arr=alloca(size);

它在标准的C99中,在许多编译器中作为编译器扩展而存在。


查看完整回答
反对 回复 2019-06-21
  • 3 回答
  • 0 关注
  • 1564 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信