使用释放的内存是否有风险?

Eya*_*lAr 1 c memory-management

假设我有一个char指针指向内存中的某个字符串.
并假设我想将该字符串复制到内存中的其他位置.

void cpy(char **dst, char *src)
{
    *dst = (char *) realloc(*dst, strlen(src) + 1);
    memcpy(*dst, src, strlen(src) + 1);
}
Run Code Online (Sandbox Code Playgroud)

(假设内存分配成功,并且src不是NULL)
如果我这样调用这个函数怎么办:

char *str = malloc(14);
memcpy(str,"hello, world!", 14);
cpy(&str,str+7);
Run Code Online (Sandbox Code Playgroud)

现在我希望srt指向字符串"world!"(它在我的测试中做了).
但是,我担心的是,在这个调用cpy,*dstsrc实际指向的不同位置相同的字符串.并且,在调用realloc*dst,可能会释放此内存.但在下一行我试图从那个地方复制memcpy.

所以问题是:它有什么问题吗?
或者用另一种方式 - 是否可以释放内存,然后立即使用它?

谢谢.

注意:示例已更新,以便realloc在使用时获得的内存上调用malloc.

Ker*_* SB 9

这一切都是错的.调用未获得的指针等是彻头彻尾的未定义行为.reallocmalloc

正如@Daniel Fischer指出的那样,memcpy在内存的重叠区域使用它也是未定义的行为(在这种情况下你应该使用memmove),所以你必须要小心.


更新:经过大量编辑后,问题就完全不同了.它现在相当于这个浓缩版本:

char * s = malloc(14);
strcpy(s, "hello, world!");

char * p = realloc(s, 14);

memcpy(p, s, 14);
Run Code Online (Sandbox Code Playgroud)

这也是未定义的行为,因为s在成功之后realloc不允许再访问指向的内存,并且不允许p在不成功之后访问指向的内存realloc.

  • 另外,使用重叠的内存块调用`memcpy`是UB. (2认同)