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 指向的对象将永远不会被删除。(内存泄漏)
  • 通过
    删除[]string2字符串1所在的原始字符数组
    指向的内容将被删除。(回收非预期内存)
  • 通过
    删除[]string1
    删除[]字符串2,该内存
    已删除,将再次删除。(失败)
  • 三个问题:

  • 原始字符数组,该数组包含原始变量string2 指向的对象将永远不会被删除。(内存泄漏)
  • 通过
    删除[]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请不要忘记接受您认为最有用的答案。