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