C++ 删除多个字符指针
删除这两个指针时遇到问题:C++ 删除多个字符指针,c++,C++,删除这两个指针时遇到问题: 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;
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>
\define\u CRTDBG\u MAP\u ALLOC
#包括
#包括
当我在没有“delete[]string1”的情况下运行程序时,它会给我“{66}个正常块,0x0075E300,25字节长。”所以“delete[]string2”是在删除string1。这对我来说没有意义,但我猜这和作业有关。我尝试查找有关它的内容,但没有任何效果。代码失败,因为删除同一指针两次,导致未定义的行为(请参阅)。在语句
string2=string1之后
指针string1
和string2
具有相同的地址,您无法再访问关联之前存储在string2
中的地址,这也会导致内存泄漏
如果要将
string1
复制到string2
,则应使用strncpy(string2,string1,20)
(请参阅),在这种情况下,指针本身保持不变,并且您提供的释放代码有效。由于删除同一指针两次,代码失败,这会导致未定义的行为(请参阅)。在语句string2=string1之后
指针string1
和string2
具有相同的地址,您无法再访问关联之前存储在string2
中的地址,这也会导致内存泄漏
如果要将
string1
复制到string2
,则应使用strncpy(string2,string1,20)
(请参阅)在这种情况下,指针本身保持不变,并且您提供的释放代码有效。在分配string1
之前,您必须删除分配给string2
的内存
关联后,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.
在分配
string1
之前,您必须删除分配给string2
的内存
关联后,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.
正如您已经指出的,代码中的问题是分配。
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
正如您已经指出的,代码中的问题是分配。
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
三个问题:
删除[]string2代码>字符串1所在的原始字符数组
指向的内容将被删除。(回收非预期内存)
删除[]string1代码>后删除[]字符串2代码>,该内存
已删除,将再次删除。(失败)
删除[]string2代码>字符串1所在的原始字符数组
指向的内容将被删除。(回收非预期内存)
删除[]string1代码>后删除[]字符串2代码>,该内存
已删除,将再次删除。(失败)
string2=string1
-您是否认为这是一个字符串副本?为什么C++中使用<代码> char */COS> s而不是<代码> STD::String < /Cord>?使用std::string
。您试图删除同一指针两次。另一个在string2=string1后丢失代码>。不仅仅是导致双重删除的分配;这也是内存泄漏。@user2357112请不要忘记接受您认为最有用的答案。string2=string1
-您是否认为这是字符串副本?为什么C++中使用<代码> char */COS> s而不是<代码> STD::String < /Cord>?使用std::string
。您试图删除同一指针两次。另一个在string2=string1后丢失代码>。不仅仅是导致双重删除的分配;这也是内存泄漏。@user2357112请不要忘记接受您认为最有用的答案。