再会!有一段代码:
// mry_char* - это wchar_t*
// mry_charsz - это sizeof(wchar_t)
void mry_strcat(mry_char* _dest, const mry_char const* _src) {
const u32 dl = mry_strlen(_dest);
const u32 sl = mry_strlen(_src);
_dest = realloc(_dest, (dl + sl + 1) * mry_charsz);
memmove(_dest + dl, _src, sl * mry_charsz);
_dest[dl + sl] = '\0';
}
cppcheck写道:
Id: memleak
Кратко: Memory leak: _dest
Сообщение: Memory leak: _dest
First included by: mary.c
Строка 69: _dest[dl + sl] = '\0';
realloc
我知道如果块随着大小的增加而移动,就会出现泄漏,这是真的吗?
更新程序
固定数组越界。
在您的代码中,您应该期望
realloc
始终移动块,无论它是增长、收缩还是根本不改变。这些决定是根据您无法控制的情况做出的。有时不动,也不过是难得一见的运气罢了。您的泄漏是由于
_dest
未以任何方式返回指向外部代码的指针的新值。在一般情况下,您分配的内存realloc
总是会泄漏。要么_dest
通过返回值从函数返回新的,要么“通过引用”使用它,即 使它成为mry_char**
一个参数。(是的,如果
realloc
指针的值_dest
没有因为工作而改变,那么正式地“没有必要”返回它,但在实际代码中期待这个完全是垃圾。在一般情况下,指针会改变。)此外,与c相关,如果它根本无法分配内存,
realloc
也会发生泄漏。realloc
然后它将返回一个空指针,但不会释放旧内存,即_dest
在函数内部,您将无法访问最初由 指定的内存。(这是否是真正的泄漏取决于您是否存储了对该内存的其他访问路径。您的代码没有显示这一点。)另外,如果那么,为什么只为
dl + sl
元素分配内存_dest[dl + sl] = '\0'
?在分配的内存之外发生显式崩溃。这样的泄漏不是到期
realloc
的- 除非您稍后忘记删除分配的内存。另一件事是你
1. 不检查结果
realloc
(也不保存)2. 没有分配足够的内存(有溢出)
3. 据我记得,因为
wchar_t
你需要写 not'\0'
,但是L'\0'