首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >malloc:*对象0x7fff5fbff350错误:未分配被释放的指针

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

Stack Overflow用户
提问于 2015-02-20 02:11:44
回答 1查看 5K关注 0票数 0

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

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

我怎么能删除仿冒呢?

我认为我也应该删除在cat2函数(p,q)中创建的“未使用”新闻,但这也给了我同样的错误。我在这里失去了什么记忆?

代码语言:javascript
复制
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;
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-02-20 02:19:17

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指向完全不同的位置和泄漏内存)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28620586

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档