我在删除这两个指针时遇到了麻烦:
int *p = new int;
char * string1 = new char[20];
char * string2 = new char[25];
strcpy(string1, "Sheldon");
string2 = string1;
delete p;
delete[] string2; //this works without the next line
delete[] string1; //when I add this, it fails at string2 = string1
我正在使用
进行内存泄漏检测#define _CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h>
当我在没有“delete [] string1的情况下运行程序时,”它给了我“{66}正常块,位于0x0075E300,长度为25个字节。”所以“delete [] string2”正在删除string1。这对我没有意义,但我猜它与作业有关。我尝试查找有关它的内容,但没有任何效果。
答案 0 :(得分:4)
代码失败是因为您要删除两次相同的指针,这会导致未定义的行为(请参阅here)。在语句string2 = string1;
之后,指针string1
和string2
保持相同的地址,并且您无法在分发之前访问存储在string2
中的地址,这也会导致内存泄漏。
如果您想将string1
复制到string2
,请使用strncpy(string2, string1, 20)
(请参阅documentation),在这种情况下,指针本身保持不变以及您提供的释放代码是有效的。
答案 1 :(得分:0)
在分配string2
之前,您必须删除分配给string1
的内存。
在分配后,string2
和string1
是同一个。请查看以下代码以供参考:
int *p = new int;
char * string1 = new char[20];
char * string2 = new char[25];
strcpy(string1, "Sheldon");
delete[] string2; //this would prevent memory leak
string2 = string1;
delete p;
delete[] string1; //now you are releasing the memory held by string2 too.
答案 2 :(得分:0)
正如您已经确定的那样,代码中的问题是分配。
在string2 = string1;
之后,string2
和string1
都指向相同的内存位置。因此,当您调用delete[] string2
时,您可以释放string1
指向的内存。然后你调用delete[] string1
并得到未定义的行为作为指针指向已被释放的内存。也就是说,你有两次相同的指针。
此外,您的代码包含内存泄漏,因为您没有取消分配为string2
保留的初始内存。你应该做的是:
delete[] string2; // release the memory for string2
string2 = string1; // string1, string2 point to the same memory area
delete[] string1; // release the memory for string1
答案 3 :(得分:0)
char * string1 = new char[20];
char * string2 = new char[25];
strcpy(string1, "Sheldon");
string2 = string1;
delete p;
delete[] string2; //this works without the next line
delete[] string1; //when I add this, it fails at string2 = string1
三个问题:
delete[] string2;
原始char数组中的string1
指向将被删除。 (回收无意识的记忆)delete[] string1;
之后的delete[] string2;
,记忆
已删除,将再次删除。(失败)