将在strcpy后删除[]导致内存泄漏

Will delete[] after strcpy cause memory leak?

本文关键字:内存 泄漏 strcpy 删除 将在      更新时间:2023-10-16
char* myChar=new char[20];
char* myChar2="123";
strcpy(myChar, myChar2);
...
delete[] myChar;

我的问题是,如果strcpy''放在"123"的末尾,那么delete[] myChar是否只删除前3个字符而不删除myChar的其余部分?

谢谢…

不,只要您将new []返回的地址传递给delete [], delete []就会释放new []分配的所有内存。
它只是正确地记住分配了多少内存,而不管内存中放置了什么。

您的delete[]释放了所有20个字符,而不仅仅是您真正使用的3+1。

Delete删除字符串时不查找"n"。

编译器在为字符串分配内存块时查找"n"。

因此,通过查看实际为特定指针分配的内存块的大小,删除myChar和myChar2将以完全相同的方式工作。这在您的情况下不使用内存泄漏。

这是c++需要理解的一个基本方面。它引起的混乱是有根据的。请看下面的例子:

char* myChar1 = new char[20];
char* myChar2 = (char*)malloc(20);

尽管两个指针具有相同的类型,您应该使用不同的方法来释放它们所指向的对象:

delete [] myChar1;
free(myChar2);

注意,如果你这样做:

char *tmp = myChar1;
myChar1 = myChar2;
myChar2 = myChar1;

之后你需要:

delete [] myChar2;
free(myChar1);

您需要跟踪对象本身(即它是如何分配的),而不是保存指向该对象的指针的位置。释放你想要释放的对象,而不是存储这个对象信息的地方。

char* myChar=new char[20]; // you allocate 20 space for 20 chars
          +-----------------+
myChar -> | x | x | ... | x | // x = uninitialized char
          +-----------------+
char* myChar2="123";
           +----------------+ 
myChar2 -> | 1 | 2 | 3 |  | // myChar2 points to string
           +----------------+ 
strcpy(myChar, myChar2); // copy string to 20 char block
// strcpy copies char by char until it finds a  i.e. 4 chars
// in this case
          +----------------------------------+
myChar -> | 1 | 2 | 3 |  | x | x | ... | x |
          +----------------------------------+
 // note that characters after the string 123 are 
 // still uninitialized
delete[] myChar;
// the whole 20 chars has been freed