簡體   English   中英

strcpy 后刪除[] 會導致內存泄漏嗎?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM