<menu id="ycqsw"></menu><nav id="ycqsw"><code id="ycqsw"></code></nav>
<dd id="ycqsw"><menu id="ycqsw"></menu></dd>
  • <nav id="ycqsw"></nav>
    <menu id="ycqsw"><strong id="ycqsw"></strong></menu>
    <xmp id="ycqsw"><nav id="ycqsw"></nav>
  • c語言申請內存空間(c語言動態分配內存數組)


    本期是C++基礎語法分享的第八節,今天給大家來分享一下:

    (1)內存分配和管理;

    (2)malloc、free;

    (3)new、delete;

    (4)定位 new;

    (5)delete this 合法嗎?

    (6)如何定義一個只能在堆上(棧上)生成對象的類?

    C++基礎語法梳理:內存分配和管理

    內存分配和管理

    malloc、calloc、realloc、alloca

    malloc:申請指定字節數的內存。申請到的內存中的初始值不確定。

    calloc:為指定長度的對象,分配能容納其指定個數的內存。申請到的內存的每一位(bit)都初始化為 0。

    realloc:更改以前分配的內存長度(增加或減少)。當增加長度時,可能需將以前分配區的內容移到另一個足夠大的區域,而新增區域內的初始值則不確定。

    alloca:在棧上申請內存。程序在出棧的時候,會自動釋放內存。但是需要注意的是,alloca 不具可移植性, 而且在沒有傳統堆棧的機器上很難實現。alloca 不宜使用在必須廣泛移植的程序中。C99 中支持變長數組 (VLA),可以用來替代 alloca。

    malloc、free

    用于分配、釋放內存

    malloc、free 使用

    申請內存,確認是否申請成功

    char *str = (char*) malloc(100);
    assert(str != nullptr);

    釋放內存后指針置空

    free(p); 
    p = nullptr;

    new、delete

    new / new[]:完成兩件事,先底層調用 malloc 分配了內存,然后調用構造函數(創建對象)。

    delete/delete[]:也完成兩件事,先調用析構函數(清理資源),然后底層調用 free 釋放空間。

    new 在申請內存時會自動計算所需字節數,而 malloc 則需我們自己輸入申請內存空間的字節數。

    new、delete 使用

    申請內存,確認是否申請成功

    int main()
    {
        T* t = new T();     // 先內存分配 ,再構造函數
        delete t;           // 先析構函數,再內存釋放
        return 0;
    }

    定位 new

    定位 new(placement new)允許我們向 new 傳遞額外的地址參數,從而在預先指定的內存區域創建對象。

    new (place_address) type
    new (place_address) type (initializers)
    new (place_address) type [size]
    new (place_address) type [size] { braced initializer list }

    (1)place_address 是個指針

    (2)initializers 提供一個(可能為空的)以逗號分隔的初始值列表

    delete this 合法嗎?

    合法,但:

    必須保證 this 對象是通過 new(不是 new[]、不是 placement new、不是棧上、不是全局、不是其他對象成員)分配的

    必須保證調用 delete this 的成員函數是最后一個調用 this 的成員函數

    必須保證成員函數的 delete this 后面沒有調用 this 了

    必須保證 delete this 后沒有人使用了

    如何定義一個只能在堆上(棧上)生成對象的類?

    只能在堆上

    方法:將析構函數設置為私有

    原因:C++ 是靜態綁定語言,編譯器管理棧上對象的生命周期,編譯器在為類對象分配??臻g時,會先檢查類的析構函數的訪問性。若析構函數不可訪問,則不能在棧上創建對象。

    只能在棧上

    方法:將 new 和 delete 重載為私有

    原因:在堆上生成對象,使用 new 關鍵詞操作,其過程分為兩階段:第一階段,使用 new 在堆上尋找可用內存,分配給對象;第二階段,調用構造函數生成對象。將 new 操作設置為私有,那么第一階段就無法完成,就不能夠在堆上生成對象。

    版權聲明:本文內容由互聯網用戶自發貢獻,該文觀點僅代表作者本人。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如發現本站有涉嫌抄襲侵權/違法違規的內容, 請發送郵件至 舉報,一經查實,本站將立刻刪除。

    發表評論

    登錄后才能評論
    国产精品区一区二区免费