strcpy后会删除[]导致内存泄漏吗?

时间:2013-05-18 05:53:40

标签: c++ memory strcpy

char* myChar=new char[20];
char* myChar2="123";
strcpy(myChar, myChar2);

...

delete[] myChar;

我的问题是,如果strcpy'\0'放在"123"的末尾,那么delete[] myChar只会删除前3个字符而无法删除其余{ {1}}?

谢谢...

5 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:1)

删除字符串时,删除不会查找“\ n”。

而是编译器在为字符串分配内存块时查找“\ n”。

因此,通过查看实际为特定指针分配的内存块的大小,删除myChar和myChar2将因此以完全相同的方式工作。这样就不会导致内存泄漏。

答案 2 :(得分:1)

这是需要理解的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);

您需要跟踪对象本身(即如何分配对象),而不是您保留指向此对象的指针的位置。并释放要释放的对象,而不是存储有关此对象的信息的位置。

答案 3 :(得分:1)

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

答案 4 :(得分:1)

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 | \0 | // myChar2 points to string
           +----------------+ 

strcpy(myChar, myChar2); // copy string to 20 char block
// strcpy copies char by char until it finds a \0 i.e. 4 chars
// in this case

          +----------------------------------+
myChar -> | 1 | 2 | 3 | \0 | x | x | ... | x |
          +----------------------------------+
 // note that characters after the string 123\0 are 
 // still uninitialized

delete[] myChar;

// the whole 20 chars has been freed