亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

為什么使用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條經驗 獲得超6個贊

舊的問題,但沒有人提到,它應該被替換為可變長度數組。

char arr[size];

而不是

char *arr=alloca(size);

它在標準的C99中,在許多編譯器中作為編譯器擴展而存在。


查看完整回答
反對 回復 2019-06-21
  • 3 回答
  • 0 關注
  • 1610 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號