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

标签 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;
}

最佳答案

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

关于c++ - malloc:对象 0x7fff5fbff350 的 *** 错误:未分配正在释放的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28620586/

相关文章:

c++ - 'must have an argument of class or enumerated type'到底是什么意思

c++ - 在MinGW的Shell中编译libtcod时出现 “Error 1”

memory - 在现有的大量代码中使用 jemalloc

java - 当我尝试编译时出错

c - 向结构添加元素时出现段错误

c - 通过 `malloc` 替换 `calloc` 、 `realloc` 、 `free` 和 `LD_PRELOAD` 时出现段错误

c++ - 调用静态 C++ 类方法时的堆栈溢出 (SIGSEGV)

c++ 动态 DLL 生命周期中的静态变量。或者他们为什么死了?

c++ - 将类对象传递给模板函数。 C++

compiler-errors - PureScript无法匹配相同的约束类型