簡體   English   中英

C 和 C++ 中的內存管理有什么區別

[英]What are the differences between memory management in C and C++

如何為一組const char*動態分配內存? 即,例如const char** array = /* ??? */ const char** array = /* ??? */ 我知道malloc類似於 C++ 中的new ,但總是返回一個void*

更廣泛地說,在 C 和 C++ 中如何處理內存管理之間有什么區別? 例如,在 C 中我必須注意哪些有人可能在 C++ 中沒有考慮過的事情?

要分配數組,您將執行以下操作:

const char **array = malloc( x * sizeof( char * ) );

然后分配數組的每個元素。

if ( array )
    for ( int i = 0; i < x; ++i )
        array[i] = malloc( y * sizeof( char ) );
else
    printf( "malloc failed :(" );

malloc返回一個void*但它與其他指針類型兼容。

在 C 和 C++ 中,您都需要自己管理內存,但 C 沒有像unique_ptr這樣的東西——而且,沒有newdelete ,使用mallocfree 還有callocrealloc

malloc可以在失敗的情況下返回NULL ,所以你也應該檢查一下。 請注意,它不會像 C++ 中的new can 那樣拋出。 可以在此處找到有關malloc更多信息。

根據要求,在釋放數組時,您基本上只是反向執行相同的操作。 請注意, free不接受大小,只接受指針。 free函數將忽略NULL指針,因此您不必在這里擔心。

for ( int i = 0; i < x; ++i )
   free( array[i] );
free( array );

當然,就像在 C++ 中一樣,不要雙倍free內存。 那很不好。 :)

mallocnew之間的主要區別在於new將為分配的對象調用默認構造函數(如果適用)。 這就是為什么在 C++ 中混合這兩者是非常糟糕的做法的原因之一。

malloc要求您檢查 NULL 的返回值以檢查它是否失敗,而new會在失敗時拋出std::bad_alloc異常。

另一個很大的區別是 C++ 有內存泄漏運算符new[] ,它分配一個數組,當再次意外使用delete而不是delete[]時,該數組將泄漏。

C++ 還允許您重載這些運算符 - 存在需要這樣做的有效情況,但大多數情況下這是非常值得懷疑的做法。

C++ 中的手動內存分配大多不受歡迎,這是有充分理由的。 在這種情況下,您寧願使用std::string並讓該類擔心內存分配。 或者,您可以使用智能指針類為您進行釋放。

C++ 中存在但 C 中不存在的另一個內存管理方面是 C++ 具有面向對象的類方法。 當一個實例被創建時,該實例的構造函數被調用,當該實例超出范圍時,析構函數被調用,這個行為由編譯器自動執行,並且對程序員是透明的。

因此,最好在析構函數中運行動態內存去分配,以確保當實例不再在范圍內時釋放實例分配的任何動態內存。

構造函數和析構函數的概念只存在於 C++ 而不是 C。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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