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;
上犯了同样的错误。这些使 p
和 q
指向那些缓冲区。您泄漏了通过 new
分配的所有内存,并通过在 s1
.
末尾写入字符导致缓冲区溢出
我猜您打算将字符复制到您通过 new
分配的缓冲区中。但是,p
和 q
缓冲区无论如何都是无用的;您应该将字符复制到 rvalue
指向的缓冲区中。为此,您必须使用 *rvalue
等等(这意味着:rvalue
指向的位置,而不是让 rvalue
指向完全不同的地方并泄漏内存)。
我已经看过很多关于这个错误的页面,但我无法理解我的代码做错了什么,所以我希望如果我发布了它,有人会给出一些启示。
这是一个 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;
上犯了同样的错误。这些使 p
和 q
指向那些缓冲区。您泄漏了通过 new
分配的所有内存,并通过在 s1
.
我猜您打算将字符复制到您通过 new
分配的缓冲区中。但是,p
和 q
缓冲区无论如何都是无用的;您应该将字符复制到 rvalue
指向的缓冲区中。为此,您必须使用 *rvalue
等等(这意味着:rvalue
指向的位置,而不是让 rvalue
指向完全不同的地方并泄漏内存)。