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

...

delete[] myChar;

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

谢谢...

4

5 回答 5

3

不,delete []只要您将new []相同的地址传递给. 它只是正确地记住分配了多少内存,而不管该内存中放置了什么。delete []new []

于 2013-05-18T05:55:47.113 回答
1

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

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

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

于 2013-05-18T05:57:40.407 回答
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);

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

于 2013-05-18T05:58:59.887 回答
1

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

于 2013-05-18T05:59:47.970 回答
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
于 2013-05-18T06:20:08.267 回答