我已经看到了很多关于这个错误的页面,但是我无法理解我的代码做错了什么,所以我希望如果我发布了它,有人能给我一些启示。
这是一个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;
}发布于 2015-02-20 02:19:17
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指向完全不同的位置和泄漏内存)。
https://stackoverflow.com/questions/28620586
复制相似问题