char* myChar=new char[20];
char* myChar2="123";
strcpy(myChar, myChar2);
...
delete[] myChar;
我的问题是,如果strcpy
将'\0'
放在"123"
的末尾,那么delete[] myChar
只会删除前3个字符而无法删除其余{ {1}}?
谢谢...
答案 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