2016-04-03 63 views
0

我无法删除这些两个指针:当我运行程序,他没有“删除删除多个字符指针

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> 

[] string1“,它给了我”{66}在0x0075E300正常的块,25个字节长。“所以“delete [] string2”正在删除string1。这对我来说没有任何意义,但我猜测它与任务有关。我试图查找有关它的东西,但没有任何工作。

+1

'字符串2 = string1' - 你的印象是,这是一个字符串,下副本?你为什么在C++中使用'char *'s而不是'std :: string's? – user2357112

+0

没有人有时间。使用'std :: string'。 –

+0

您正在尝试删除相同的指针两次。另一个在'string2 = string1;'之后丢失。 –

回答

4

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

如果你想string1复制到string2,你shold使用strncpy(string2, string1, 20)(见documentation)在这种情况下,指针本身保持不变,您所提供的释放码是有效的。

0

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

在分配后,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. 
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 
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. 原来的字符数组,其原来的变量字符串2 指出,将永远不会被删除。 (内存泄漏)
  2. 通过delete[] string2;指定的字符串1 将被删除。 delete[] string2;后(回收意外内存)
  3. 通过delete[] string1;,使内存 已经被删除,将再次删除(失败)