分配失败时该怎么办?

时间:2014-06-17 13:52:44

标签: c string memory-management

我编写了一个使用HeapAlloc()和HeapFree()连接字符串的函数,我想检查这些函数的返回。但是,如果分配失败,我必须再次尝试分配,直到它工作。怎么做?

我将此问题与this one相关联。

void add_to_buffer(LPTSTR* buffer, LPCTSTR msg) {
    // Determine new size
    int newSize = 0;

    // Allocate new buffer
    if (*buffer == NULL)
        newSize =  _tcsclen(msg) + 1;
    else
        newSize = _tcslen(*buffer) + _tcsclen(msg) + 1;

    // Do the copy and concat
    if (*buffer == NULL)
    {
        *buffer = (LPTSTR)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, newSize * sizeof(*buffer));
        _tcsncpy_s(*buffer, newSize, msg, _tcsclen(msg));
    }
    else
    {
        *buffer = (LPTSTR)HeapReAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, *buffer, newSize * sizeof(*buffer));
        _tcsncat_s(*buffer, newSize, msg, _tcsclen(msg));
    }
}

1 个答案:

答案 0 :(得分:6)

  

但是,如果分配失败,我必须再次尝试分配,直到它工作。怎么做?

不,如果分配失败,那就结束了。此时您应该终止该过程。根本没有理由相信随后的分配会成功。尝试一次又一次地获得帮助,计算机不能那样工作。一旦你达到低内存状态,你就会发现左,右和中心问题。最安全的行动就是中止。

现在,可以编写可以在低内存状态下存活的程序。但这需要非常仔细地设计和处理内存分配。它要求程序的所有部分都遵循该设计。你的计划不具备这种性质。