6

私のstackAlloc関数は次のようになります。

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);
    }
}

そのように変更すると、すべてが機能する代わりにstackAlloc関数が常に使用されます。mallocalloca

関数をマクロに変更したところ、期待どおりに機能するようになりました。

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

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

3 に答える 3

9

MSDNのドキュメント_alloca()に従って、コードが を呼び出すため、Windowsで実行していると仮定します。

_allocaは、プログラム スタックからsizeバイトを割り当てます。割り当てられたスペースは、呼び出し元の関数が終了すると自動的に解放されます

呼び出し元の関数が終了すると、メモリが解放されることに注意してください。これは、呼び出し元の関数が戻ることも意味すると想定しています。

あなたのコード:

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

が返され、 で取得したメモリが解放されます_alloca()

于 2016-06-13T12:27:11.537 に答える
3

マニュアルページから

alloca() を呼び出した関数が呼び出し元に戻ると、この一時スペースは自動的に解放されます。

したがって、stackAlloc関数が戻るたびに、メモリが自動的に解放されます。

于 2016-06-13T12:27:17.367 に答える