char* myChar=new char[20];
char* myChar2="123";
strcpy(myChar, myChar2);
...
delete[] myChar;
我的问题是,如果strcpy
把 a'\0'
放在末尾"123"
,那么delete[] myChar
只会删除前 3 个字符而无法删除其余字符myChar
?
谢谢...
不,delete []
只要您将new []
相同的地址传递给.
它只是正确地记住分配了多少内存,而不管该内存中放置了什么。delete []
new []
删除字符串时,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);
您需要跟踪对象本身(即它是如何分配的),而不是您保存指向该对象的指针的位置。并释放您要释放的对象,而不是存储有关此对象的信息的地方。
您的 delete[] 释放了所有 20 个字符,而不仅仅是您真正使用的 3+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