在C中连接两个字符串并动态分配缓冲区
Concat two strings in C and allocate dynamically buffer
我知道已经有人问过这种问题了。我也用这个题目的解决方案进行了测试。然而,我想知道如何使用这种函数没有内存泄漏也没有例外。
注意:LPTSTR
~ char*
和LPCTSTR
~ const char*
void add_to_buffer(LPTSTR* buffer, LPCTSTR msg) {
// Determine new size
int newSize = 0;
// Allocate new buffer
if (*buffer == NULL)
newSize = _tcsclen(msg) + 1; // strlen()
else
newSize = _tcslen(*buffer) + _tcsclen(msg) + 1;
LPTSTR newBuffer = (LPTSTR)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, newSize); // malloc()
// Do the copy and concat
if (*buffer == NULL)
_tcscpy(newBuffer, msg); // strcpy()
else
{
_tcscpy(newBuffer, *buffer);
_tcscat(newBuffer, msg); // strcat()
// release old buffer
HeapFree(GetProcessHeap(), 0, *buffer); // free()
}
// store new pointer
*buffer = newBuffer;
}
测试:
LPTSTR test = NULL;
add_to_buffer(&test, _T("User:rn"));
add_to_buffer(&test, _T("42"));
第一次调用add_to_buffer
工作。然而,第二个函数调用在HeapFree
处导致异常。我确信这是一个关于指针的问题,但我不明白如何修复它。
这是一个好方法吗?如何修复我的异常?
如果您将代码编译为多字节应用程序,那么这一行
LPTSTR newBuffer = (LPTSTR)HeapAlloc(
GetProcessHeap(),
HEAP_ZERO_MEMORY,
newSize
);
可能分配到很少的内存。
修改:
LPTSTR newBuffer = (LPTSTR)HeapAlloc(
GetProcessHeap(),
HEAP_ZERO_MEMORY,
newSize * sizeof(*newBuffer)
);
除此之外,代码缺少对系统调用的错误检查,代码看起来很好。
然而,为了简化事情,可以使用HeapReAlloc()
而不是HeapAlloc()
和HeapFree()
的组合。
如果程序崩溃了,这可能是由于在实际崩溃之前内存管理已经被打乱了。
如果你的程序是unicode启用的,你没有分配足够的内存-因为字符串长度(以符号表示)和字符串大小(以字节表示)不匹配。
如果不是,我不认为有理由使用非标准c类型而不是标准c类型。这应该不成问题。
相关文章:
- 查找字符在两个索引之间出现的次数
- 如何读取单个字符并在输入两个字符序列时输出? 使用 while 循环和C++
- 我已经建立了递归关系,它找到了两个字符串之间最长的连续公共字符串,我怎么能跳过其中一个字符串中的一个字符
- 函数返回两个字符串的第一个常用字符
- 在函数中连接两个字符,并在 C++ 中返回输出
- 为什么要更改这两个代码的输出"&"字符?
- 舍入 QDecDouble 值,精度最多为两个字符
- 计算两个字符序列
- 在c++中连接两个字符
- 查找和比较两个字符串中的字符
- 为什么C++中不允许连接两个常量字符*?
- 如何使用排序和比较这两个函数在 c++ 中对字符数组进行排序?
- 有没有办法我可以从 istringstream 中读取两个字符
- 如何查找两个字符串 c++ 中常用字符的数量
- 如何查看两个字符变量是否相等
- 使用位于 C 字符串中的两个字符*获取子字符串
- C++ std::string 中是否有任何函数可以计算两个字符串的相同起始字符的总数或任何最佳方法
- 重命名两个目录中的文件名,如果它们之间的某些字符匹配 - 矢量下标超出范围
- 比较两个字符的问题
- 如何修复密码条目,它一次输入两个字符