malloc: *** error for object 0x7fff5fbff350: 释放的指针未分配

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

我已经看过很多关于这个错误的页面,但我无法理解我的代码做错了什么,所以我希望如果我发布了它,有人会给出一些启示。

这是一个 C++ class 项目。目标是编写一个函数,将两个 C 字符串 (char*) 和 returns 连接在一起形成一个新的。我在这里编译,除了当我尝试删除 copycat 时,我在这个问题的标题中得到了 malloc 错误。

如何删除山寨?

我想我也应该删除我在 cat2 函数 (p, q) 中创建的 "unused" 新闻,但这给了我同样的错误。我在释放内存时错过了什么?

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 指向完全不同的地方并泄漏内存)。