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

时间:2015-02-20 02:11:45

标签: c++ compiler-errors malloc

我看到很多页面都出现了这个错误,但是我无法理解我的代码出错了,所以我希望如果发布它,有人可以解释一下。

这是一个c ++类项目。目标是编写一个函数,它接受两个C字符串(char *)并返回它们连接在一起的新字符串。我在这里编译,除了当我尝试删除copycat时,我在这个问题的标题中得到了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;
}

1 个答案:

答案 0 :(得分:1)

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