删除多个char指针

时间:2016-04-03 08:08:42

标签: 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; //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。这对我没有意义,但我猜它与作业有关。我尝试查找有关它的内容,但没有任何效果。

4 个答案:

答案 0 :(得分:4)

代码失败是因为您要删除两次相同的指针,这会导致未定义的行为(请参阅here)。在语句string2 = string1;之后,指针string1string2保持相同的地址,并且您无法在分发之前访问存储在string2中的地址,这也会导致内存泄漏

如果您想将string1复制到string2,请使用strncpy(string2, string1, 20)(请参阅documentation),在这种情况下,指针本身保持不变以及您提供的释放代码是有效的。

答案 1 :(得分:0)

在分配string2之前,您必须删除分配给string1的内存。

在分配后,string2string1是同一个。请查看以下代码以供参考:

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;之后,string2string1都指向相同的内存位置。因此,当您调用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

三个问题:

  1. 原始变量string2的原始char数组 指向永远不会被删除。 (记忆泄漏)
  2. delete[] string2;原始char数组中的string1 指向将被删除。 (回收无意识的记忆)
  3. delete[] string1;之后的delete[] string2;,记忆 已删除,将再次删除。(失败)