簡體   English   中英

使用 malloc() 時出現意外大小

[英]Unexpected size when using malloc()

我想測試一下自己的知識,寫了一個小程序,長這樣:

#include <iostream>
#include <cstdlib>

int main()
{
    int* mem1 = (int*) malloc(2 * sizeof(int));
    int* mem2 = (int*) malloc(5 * sizeof(int));

    std::cout << "mem1: " << sizeof(mem1) << std::endl;
    std::cout << "mem2: " << sizeof(mem2) << std::endl;

    return 0;
}

我得到輸出:

mem1: 8
mem2: 8

當我將值更改為malloc(2 * sizeof(int))malloc(3 * sizeof(int)) ,輸出也不會改變。

是我使用的教程,所以我不完全確定這是否是內存安全的,在調用malloc時轉換為int* 我也發現了這個問題,但我覺得它對我的情況沒有太大幫助。 Clang++ 是我使用的編譯器,但我認為它沒有任何區別。

我最好的猜測是,它分配了相同的內存,因為它不知道內存在哪里結束。

sizeof告訴您指針的編譯時大小(即使您根本沒有調用malloc ,它也會報告相同的值)。 沒有符合標准的方法來確定malloc分配的malloc 如果您需要保留該信息,則必須將其存儲在邊帶中。

您看到的8個字節是指針( int* )的大小。 sizeof() 在編譯時完成,編譯器無法在編譯時知道這個大小( malloc是動態內存分配)。

無論分配的內存塊的大小如何,表達式sizeof(mem1)始終返回相同的值! 這是因為mem1指向已分配內存的指針,並且指針的大小不會改變(即在給定的環境中)。

在您的情況下(大概是在 64 位平台上構建)指針的長度為 8 個字節。 您可以為不同的平台(例如 32 位系統)構建它,並且您可能會得到不同的大小(例如,4); 但是,在平台上,該大小將始終為 4。

如上所述,這個問題有幾個問題:

  1. 在 C++ 中,您使用new運算符動態分配內存。 使用 malloc 的選項是使用 c 風格的 API,當需要動態分配時,將由 c-free 函數取消分配。 為了進行這樣的分配,最好使用 std::malloc ,您可以在此鏈接 (cpp 參考) 中閱讀
  2. 運算符 sizeof 正在計算靜態類型的大小,這意味着它會返回整數指針的大小,該大小是常數,具體取決於您的 CPU 架構。
  3. 在 C++ 中使用原始指針是不明智的,你應該始終確保對於在內存中動態創建的每個項目都有一個owner ,它負責在不再需要時刪除它。 在 C++11 及更高版本中,這可以通過使用智能指針來實現,例如 std::unique_ptr。 事實上,C++ 為資源管理創建了一個很好的習語,稱為 RAII(資源分配是初始化),這使它有別於許多其他語言。

暫無
暫無

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

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