malloc: 对象 0x7fff5fbff350 的 *** 错误:未分配正在释放的指针
malloc: *** error for object 0x7fff5fbff350: pointer being freed was not allocated
我已经看到了很多关于这个错误的页面,但我无法理解我的代码做错了什么,所以我希望如果我发布它,有人可以阐明一些信息。
这是一个 c++ 类项目。目标是编写一个函数,该函数接受两个 C 字符串 (char*(,并将它们连接在一起返回一个新的字符串。我在这里编译的内容,除了当我尝试删除模仿者时,我在这个问题的标题中得到了 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;
上犯了同样的错误. 这些使p
和q
指向这些缓冲区。您泄漏了通过 new
分配的所有内存,并通过写入超过 s1
末尾的字符而导致缓冲区溢出。
我猜您打算将字符复制到通过 new
分配的缓冲区中。但是,无论如何,p
和q
缓冲区都是无用的;您应该将字符复制到 rvalue
指向的缓冲区中。为此,您必须使用*rvalue
等等(这意味着:rvalue
指向的位置,而不是rvalue
指向完全不同的地方并泄漏内存(。
相关文章:
- 正在理解智能指针,但出现错误:未分配正在释放的指针
- 为什么这个 std::queue/指向结构的指针列表直到 List.Size() == 0 才释放内存?
- 如何在向量中释放指针?
- 在C++中释放内存期间,迭代器与指针有何不同
- 包含矢量指针的结构的内存释放问题
- 错误:malloc:对象 0x7f9edf504080 的 *** 错误:未分配正在释放的指针
- 错误:释放指针未分配在矢量模板类C 中
- 如何在指针初始化为数组的第一个索引后释放指针
- 如何释放指针树中的所有内存
- 从 std::align 中释放指针
- C :释放指针没有分配在课堂上
- 构造向量 C++ 后无法释放指针
- nullptr是否释放指针的内存
- C/C++ 通过调用引用或直接释放指针
- 分段释放指针向量的错误
- 有效地从指向对象本身释放指针
- 如何释放指针向量中的元素
- Sqlite c/c++api,负责从sqlite3_column_text中释放指针
- 释放指针后分配给指针
- 正在释放指针