2016-06-13 39 views
6

Benim stackAlloc işlevini kullanarak şuna benzer:Erişim ihlali alloca

void* stackAlloc(size_t size) { 
    if (size > maxStackAllocation) 
     return malloc(size); 
    else 
     return _alloca(size); 
} 
void stackAllocFree(void *ptr, size_t size) { 
    if (size > maxStackAllocation) { 
     free(ptr); 
    } 
} 

Öyle stackAlloc fonksiyonu daima alloca her şey çalışıyor yerine malloc kullanmak değiştirirseniz. kodunuzu _alloca() çağırır beri

#define maxStackAllocation 1024 
#define stackAlloc(size) \ 
(\ 
    (size > maxStackAllocation)? \ 
     malloc(size): \ 
     _alloca(size) \ 
) 

#define stackAllocFree(ptr, size) \ 
(\ 
    (size > maxStackAllocation)? \ 
     free(ptr): \ 
    void() \ 
) 
+0

"maxStackAllocation" değeri nedir? Alloca'nın belge sayfasındaki tüm uyarıları da okumanızı tavsiye ederim. –

+0

onun 1024, ben sadece 124 bayt burada – hidayat

+0

http://stackoverflow.com/a/1029951/366904 tahsis (Vulkan görünüşe göre bir C API, neden değişken uzunluklu diziler kullanmıyoruz?) –

cevap

9

MSDN documentation başına, Windows üzerinde çalıştırıyorsanız varsayarsak:

şimdi beklendiği gibi onun çalışma makro işlevi değişti ve _alloca, program yığınından boyut bayt ayırır. I varsayarak da arama fonksiyonu döner anlamına gelir - arama fonksiyonu arama fonksiyonu çıkar bellek serbest olduğu

Not çıktığında ayrılan alan otomatik olarak serbest kalır.

Kodunuz:

void* stackAlloc(size_t size) { 
    if (size > maxStackAllocation) 
     return malloc(size); 
    else 
     return _alloca(size); 
} 

döner, böylece _alloca() yoluyla elde bellek boşaltma. alloca'yı olarak adlandırılan fonksiyonu(), arayanın döndüğünde

+1

ders dışı, teşekkür ederim :) – hidayat

+1

Bu işlev, 'statik inline __forceinline' olarak işaretlenmişse, bunun geçerli olup olmadığını merak ediyorum. –

+2

@JonathonReinhart, elbette orada da geçerlidir. "alloca", "gerçek" bir malloc değildir, sadece yığınlayıcıdan daha fazla alan çıkarır.Bu, her zaman otomatik olarak serbest kalacağı anlamına gelir, çünkü CPU bununla ilgilenir. Bu nedenle, bir işlev inline olsun veya olmasın fark etmez. – Devolus

3

From the man page ,

Bu geçici alan otomatik olarak arındırılır.

stackAlloc işlevinin ne zaman döndüğü, belleği otomatik olarak boşaltacaktır.

0

Bu çalışır, ancak ben üretimde kullanmaya karşı tavsiye ediyorum:

#include <iostream> 
#include <alloca.h> 

auto stackAlloc(const size_t size) 
{ 
    return [size](){ return alloca(size); }; 
} 

int main() { 
    char *ch = (char *)stackAlloc(40000)(); 
    ch[39999] = '\0'; 

    return 0; 
} 

Counter-çek: Ben stackAlloc en parametresini azalırsa, o (beklenen davranıştır burada olan) çalışmıyor hissedin stackAlloc'ta (vb. farklı lambdaları iade ederek veya lambda kontrolü yaparak) çek vb.