malloc: 对象 0x7fff5fbff350 的 *** 错误:未分配正在释放的指针

malloc: *** error for object 0x7fff5fbff350: pointer being freed was not allocated

本文关键字:释放 指针 分配 错误 对象 0x7fff5fbff350 malloc      更新时间:2023-10-16

我已经看到了很多关于这个错误的页面,但我无法理解我的代码做错了什么,所以我希望如果我发布它,有人可以阐明一些信息。

这是一个 c++ 类项目。目标是编写一个函数,该函数接受两个 C 字符串 (char*(,并将它们连接在一起返回一个新的字符串。我在这里编译的内容,除了当我尝试删除模仿者时,我在这个问题的标题中得到了 malloc 错误。

如何删除山寨?

我想我还应该删除我在 cat2 函数 (p, q( 中创建的"未使用"新闻,但这给了我同样的错误。我在这里缺少什么解除分配内存?

char* cat2(char* dest1, char* str2)
{
    char* p = new char[100];
    char* q = new char[100];
    char* rvalue = new char[100];
    for (p = dest1; *p != 0; p++)
    {
        ;
    }

    for (q = str2; *q != 0; p++, q++ )
    {
        *p = *q;
    }
    *p = 0; /* set the last character to 0 */
    rvalue = dest1;
    return rvalue;
}
void main()
{
    char s1[] = "Hello";
    char s2[] = ", World!";
    char* copycat = cat2(s1, s2);
    cout << copycat; 
    delete copycat;
}

rvalue = dest1; rvalue指出dest1所指向的内容。这是 main 内部的本地缓冲区s1

因此,调用delete copycat;与尝试delete s1;相同,因为尝试失败,因为它不是通过new分配的。(因为它应该是delete[]的(。

你在p = dest1;q = str2;上犯了同样的错误. 这些使pq指向这些缓冲区。您泄漏了通过 new 分配的所有内存,并通过写入超过 s1 末尾的字符而导致缓冲区溢出。

我猜您打算将字符复制到通过 new 分配的缓冲区中。但是,无论如何,pq缓冲区都是无用的;您应该将字符复制到 rvalue 指向的缓冲区中。为此,您必须使用*rvalue等等(这意味着:rvalue指向的位置,而不是rvalue指向完全不同的地方并泄漏内存(。