C 分配失败时该怎么办?

C 分配失败时该怎么办?,c,string,memory-management,C,String,Memory Management,我已经编写了一个通过使用HeapAlloc()和HeapFree()连接字符串的函数,我想检查这些函数的返回。然而,如果分配失败,我必须再次尝试分配,直到它工作为止。怎么做 我把这个问题与我的观点联系起来 然而,如果分配失败,我必须再次尝试分配,直到它工作为止。怎么做 不,如果分配失败,一切都结束了。此时,您应该终止该过程。根本没有理由相信随后的分配会成功。再三尝试也无济于事,计算机不能那样工作。一旦达到内存不足的状态,就可能出现左、右和中的问题。最安全的做法是中止 现在,可以编写能够在低内存状

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

我把这个问题与我的观点联系起来

然而,如果分配失败,我必须再次尝试分配,直到它工作为止。怎么做

不,如果分配失败,一切都结束了。此时,您应该终止该过程。根本没有理由相信随后的分配会成功。再三尝试也无济于事,计算机不能那样工作。一旦达到内存不足的状态,就可能出现左、右和中的问题。最安全的做法是中止

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

然而,如果分配失败,我必须再次尝试分配,直到它工作为止。怎么做

不,如果分配失败,一切都结束了。此时,您应该终止该过程。根本没有理由相信随后的分配会成功。再三尝试也无济于事,计算机不能那样工作。一旦达到内存不足的状态,就可能出现左、右和中的问题。最安全的做法是中止


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

我的评论:1。根本没有错误检查。2.使用
HeapAlloc
使其不可移植。3.使用相同的参数多次调用
tcslen()。4.无需在安全错觉中使用
\u tcsncpy\u s
\u tcsncat\u s
。由于只计算了一次长度,请使用
memcpy
。5.除非您计划支持Windows 9x,否则不要使用
TCHAR
。我不希望我的代码是可移植的。它必须支持Windows 9x。为什么是“安全幻觉”?我不知道如果分配失败怎么办,这也是我的问题。为什么
HeapAlloc
malloc
好?对我来说,那样做毫无意义。我猜想,您最初的帖子说您通过使用
\u tcsncpy\u s
\u tcsncat\u s
使代码安全。但是他们没有在这个设置中添加任何安全性。毕竟,您是通过调用
\u tcsclen
来计算缓冲区长度的。只需使用
memcpy
。此外,
size
不是最好的变量名。我会使用
长度
。对我来说,
size
意味着
char
的计数,但您使用
size
表示数组的长度。我的评论:1。根本没有错误检查。2.使用
HeapAlloc
使其不可移植。3.使用相同的参数多次调用
tcslen()。4.无需在安全错觉中使用
\u tcsncpy\u s
\u tcsncat\u s
。由于只计算了一次长度,请使用
memcpy
。5.除非您计划支持Windows 9x,否则不要使用
TCHAR
。我不希望我的代码是可移植的。它必须支持Windows 9x。为什么是“安全幻觉”?我不知道如果分配失败怎么办,这也是我的问题。为什么
HeapAlloc
malloc
好?对我来说,那样做毫无意义。我猜想,您最初的帖子说您通过使用
\u tcsncpy\u s
\u tcsncat\u s
使代码安全。但是他们没有在这个设置中添加任何安全性。毕竟,您是通过调用
\u tcsclen
来计算缓冲区长度的。只需使用
memcpy
。此外,
size
不是最好的变量名。我会使用
长度
。对我来说,
size
意味着
char
的计数,但您使用
size
表示数组的长度。
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));
    }
}