簡體   English   中英

指針的c ++內存分配過程

[英]c++ memory allocation procedure for pointers

在MSVC ++中,首先我創建了一個vil_image_view容器(im_1)並通過提供大小(行和列)分配了內存,然后我為該指針分配了一個NULL值,在這兩個步驟之后,我創建了另一個圖像容器(im_2)並執行了分配內存的過程相同,我注意到兩個容器的內存地址相同。 那是完全隨機的嗎? 或分配和釋放如何發生?

vil_image_view是vxl庫中的圖像容器,並且是共享指針,當參考計數器變為零時,該對象將被自動刪除

vil_image_view<float> im_1;

im_1.set_size(n,m);  //0x05773ff0

im_1 = NULL;        //0x00000000

vil_image_view<float> im_2;

im_2.set_size(n,m);  //0x05773ff0

以下代碼返回由VC編譯並在Windows上運行的相同地址。

#include <iostream>

using namespace std;

int main()
{
    int *i = new int[100];
    std::cout << i << std::endl;
    delete [] i;

    int *j = new int[100];
    std::cout << j << std::endl;
    delete [] j;

    return 0;
}

不同的系統可能具有不同的內存分配和釋放策略。 但是通常,記憶是通過鏈表維護的。 一塊空閑內存(帶有標題)將指向下一個空閑內存。 已經分配的將被跳過。 釋放內存后,可能需要與現有的空閑塊合並以形成更大的塊。

分配內存時,最簡單的策略是從列表頭搜索,然后找到第一個空閑塊,該空閑塊的大小大於所需大小。

以下代碼很可能不會返回相同的地址。

#include <iostream>

using namespace std;

int main()
{
    int *i = new int[100];
    std::cout << i << std::endl;
    delete [] i;

    int *j = new int[10000];
    std::cout << j << std::endl;
    delete [] j;

    return 0;
}

暫無
暫無

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

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