gpt4 book ai didi

c++ - 为什么在此处返回 malloc 指针会导致 "HEAP CORRUPTION"空闲?

转载 作者:塔克拉玛干 更新时间:2023-11-03 08:06:46 24 4
gpt4 key购买 nike

注意:请禁止评论“C++?使用 std::string!”。这个问题使用的是 C 字符串,但更多的是关于内存管理而不是一般的字符串。

我有这个功能

char* strclone( char* src )
{
char* dst = (char*)malloc(strlen(src+1));
strcpy(dst,src);
return dst;
}

该函数应该分配一个新指针(在strclone中),将src中的字符串写入它,并返回新字符串的地址。

但是,当字符串是空闲d 时,在程序中的某个时间之后:

str = strclone( some_str_variable );    
// ..code..
free( str ) ; //! ERROR!

错误如下:

Debug Error!Program: C:\...HEAP CORRUPTION DETECTED: after Normal block (#39713) at 0x090CC448.CRT detected that the application wrote to memory after end of heap buffer.

错误发生在我在程序中调用free( str ) 的那一行。如果我将 str 的赋值更改为:

str = (char*)malloc( strlen( some_string_variable ) +1);
strcpy( str, some_string_variable ) ;
//...
free( str ) ; //fine now

然后就没有bug了,程序运行完美。

为什么 strclone 函数没有按预期工作?

最佳答案

我相信问题是你写的

(char*)malloc(strlen(src+1));

请注意,在对 strlen 的调用中,您已经编写了

strlen(src + 1)

代替

strlen(src) + 1

第一行表示“从 src 后一个字符开始的字符串长度”,即字符串长度减一(如果字符串为空,则为总垃圾)。第二个是您想要的 - 字符串的长度加上一个空终止符。如果你使用第一个版本,那么在行中

strcpy(dst,src);

您最终将写入超过缓冲区的末尾,从而导致可怕的未定义行为。在您的情况下,当您尝试释放 block 时,这表现为堆损坏错误,这是有道理的,因为您确实损坏了堆!

尝试将 +1 移出括号,看看是否能解决问题。

或者,大多数编译器都附带一个名为 strdup 的非标准函数,它完全可以执行上述函数尝试执行的操作。您可能想考虑只使用它。

希望这对您有所帮助!

关于c++ - 为什么在此处返回 malloc 指针会导致 "HEAP CORRUPTION"空闲?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7424401/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com