第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

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

為什么使用Alloca()不被視為良好做法?

為什么使用Alloca()不被視為良好做法?

C
DIEA 2019-06-21 17:01:11
為什么使用Alloca()不被視為良好做法?alloca()在堆棧上分配內(nèi)存,而不是在堆上分配內(nèi)存,如malloc()..所以,當我從例程返回時,內(nèi)存就被釋放了。因此,實際上這解決了我釋放動態(tài)分配內(nèi)存的問題。釋放通過malloc()是一個主要的頭痛,如果某種程度上錯過會導致各種記憶問題。為什么使用alloca()盡管有上述特點,但還是氣餒?
查看完整描述

3 回答

?
手掌心

TA貢獻1942條經(jīng)驗 獲得超3個贊

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

返回值-Alloca()函數(shù)返回指向分配空間開頭的指針。如果分配導致堆棧溢出,則程序行為未定義。

這并不是說它不應(yīng)該被使用。我從事的一個開放源碼軟件項目廣泛使用它,只要您不濫用它(alloca),這很好。一旦你超過了“幾百字節(jié)”的標記,就該使用它了。malloc而是朋友。您可能仍然會遇到分配失敗,但至少您將有一些失敗的跡象,而不是只是吹出堆棧。


查看完整回答
反對 回復 2019-06-21
?
料青山看我應(yīng)如是

TA貢獻1772條經(jīng)驗 獲得超8個贊

我最難忘的錯誤之一是與一個內(nèi)聯(lián)函數(shù)有關(guān),該函數(shù)使用alloca..它表現(xiàn)為程序執(zhí)行過程中隨機點的堆棧溢出(因為它在堆棧上分配)。

在頭文件中:

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

在實現(xiàn)文件中:

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

所以所發(fā)生的是編譯器的內(nèi)聯(lián)DoSomething函數(shù)和所有堆棧分配都發(fā)生在內(nèi)部。Process()函數(shù),從而將堆棧放大。在我的辯護中(我不是那個發(fā)現(xiàn)問題的人,我不得不去找一個無法解決的高級開發(fā)人員),這是不對的。alloca,它是ATL字符串轉(zhuǎn)換宏之一。

所以教訓是-不要用alloca在你認為可能是內(nèi)聯(lián)的函數(shù)中。


查看完整回答
反對 回復 2019-06-21
?
ibeautiful

TA貢獻1993條經(jīng)驗 獲得超6個贊

舊的問題,但沒有人提到,它應(yīng)該被替換為可變長度數(shù)組。

char arr[size];

而不是

char *arr=alloca(size);

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


查看完整回答
反對 回復 2019-06-21
  • 3 回答
  • 0 關(guān)注
  • 1606 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號