![](/img/trans.png)
[英]Does strcpy'ing a string into into a larger char array cause a memory leak?
[英]Will delete[] after strcpy cause memory leak?
char* myChar=new char[20];
char* myChar2="123";
strcpy(myChar, myChar2);
...
delete[] myChar;
我的問題是,如果strcpy
將'\\0'
放在"123"
的末尾,那么delete[] myChar
只刪除前 3 個字符而無法刪除myChar
的其余部分嗎?
謝謝...
不, delete []
釋放new []
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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.