2017-06-05 83 views
-1

所以我看到有配對內存管理功能,如malloc/freenew/delete,並new[]/delete[],但有時你不能總是叫newnew[],你還有叫deletedelete[],或free。例如,strdup就是封裝內存分配的一個函數,你以後還得自己釋放內存。C++何時使用delete []並正確釋放內存?

那麼你什麼時候知道釋放記憶,如果你在某種意義上並不總是寫着newmalloc?我特別好奇deleting arrays of objects。只是簡單的數組。因爲,這似乎是delete[]的用例之一。 (我在看cplusplus。)

那麼,這是否有效?這是必要的嗎?有什麼缺失?

unsigned char bytes[4] = {0xDE, 0xAD, 0xBE, 0xEF}; 
for(int i = 0; i < 4; i++) 
    std::cout << std::hex << +bytes[i]; 
delete[] bytes; 

bytes在技術上是一個unsigned char *類型,對不對?我知道我在技術上有一個指針,但因爲這不是一個對象數組,所以我不確定它是否會被自動銷燬。

+0

你只需要'delete' /'刪除[]'您以前使用創建的東西'new' /'新[]' – SingerOfTheFall

+0

這未必是真實的 - 'strdup'可能導致內存泄漏如果你不刪除。 – Peri461

+3

'strdup'是非標準的,你應該'free()'它返回的指針,而不是'delete'它,因爲它在內部使用'malloc'。 – SingerOfTheFall

回答

3

C++何時使用delete []並正確釋放內存?

當內存分配的內存爲new[]並且內存還沒有被釋放,並且不會被其他任何人解除分配。

那麼,這有效嗎?

無效。你顯示的內容有未定義的行爲。您不可以釋放自動變量。對於任何沒有用new[]分配的內容,您不得撥打delete[]

這是必要的嗎?

沒有必要。 自動變量在超出範圍時自動銷燬。

bytes從技術上講是unsigned char *類型,對不對?

我知道我在技術上有一個指針

不正確的。 bytes是在所有方面,一個數組。不是指針。

那麼C++在這方面與C指針不同?

沒什麼不同。數組也是C中的數組。

您可能會混淆陣列衰減。在值上下文中使用時,數組名將衰減爲指向第一個元素的指針。數組衰減的指針是一個指針,但數組不是。例如:

int arr[4] = {1, 2, 3, 4}; // an array 
int* ptr = arr;   // a pointer; arr decays and is assignable to a pointer 
int* ptr2 = &arr[0]   // decaying is syntactic sugar for this 
int size1 = sizeof arr;  // size of the array == sizeof(int)*4 
int size2 = sizeof ptr;  // size of the pointer == sizeof(int*) 

另外,在函數參數列表中,數組聲明與指針聲明相同。這是非常混亂的。你只需要記住數組不能被值傳遞,所以作爲函數參數的數組必須是別的。

void foo(int[4]); // confusing 
void foo(int*); // actually means this 
+0

那麼C++在這方面與C有何不同? – Peri461

+1

@ Peri461查看我添加到答案中的說明性示例。 – user2079303

2

不,這是無效的。

delete[]的每個呼叫都應與new[]配對。如果它不配對(例如strdup),這是因爲某些功能在內部調用malloc/new[]

unsigned char bytes[4] = {0xDE, 0xAD, 0xBE, 0xEF};聲明堆棧中的4個字節的內存。堆棧內存將在封閉的scope末尾自動銷燬。它們共享與函數調用所需的內存相同的內存。

new/delete分配和解除分配內存。堆內存沒有特定的獲取或破壞順序(與堆棧,即first-in-last-out不同),因此您必須明確指定delete,否則程序將不知道何時解除分配。