2017-04-19 60 views
1

假設10K堆如何分配動態內存並重新分配後,重新分配,我們如何把中間的空閒內存,以一個塊存儲

int *p1; 
p1 = malloc(3*K); 

然後,進一步4K要求:

p2 = malloc(4*K); 

內存3K現在是免費的。

一段時間後,第一內存分配,指向P1,被解除分配:

free(p1); 

這使得自由兩個3K塊內存6K。對於4K分配的另一個請求發出:

p1 = malloc(4*K); 

這將導致失敗 - NULL返回到P1 - 因爲,即使內存6K是可用的,沒有提供一個4K連續塊

如何將兩個3K塊合併爲一個6K塊?

下面的代碼給出了分段錯誤。

如果我釋放2和第4排在釋放內存兩大塊瑪吉作爲一個塊怎麼可能

#include<stdio.h> 
#include<stdlib.h> 

int** allocate2D(int rows,int cols) 
{ 
int **arr2D; 
int i; 
arr2D = (int**)malloc(rows*sizeof(int*)); 
for(i=0;i<rows;i++) 
{ 
    arr2D[i] = (int*)malloc(cols*sizeof(int)); 
} 
} 
void deallocate2D(int** arr2D,int rows) 
{ 
int i,a,b; 
printf("Enter from which row you want to delete"); 
scanf("%d",&a); 
printf("Enter till which row you want to delete"); 
scanf("%d",&b); 
for(i=a;i<b;i++) 
{ 
    free(arr2D[i]); 
} 

} 
main() 
{ 
int i,j,k; 
int **arr2D; 
arr2D=allocate2D(5,5); 
for(i=0;i<5;i++) 
{ 
    for(j=0;j<5;j++) 
     { 
     scanf("%d" ,arr2D[i][j]); 
     } 
} 
deallocate2D(arr2D,k); 
} 
+2

我曾見過這個問題(前幾天) 。答案是:你不能。 –

+2

從應用程序的角度來看,您*無法「合併」塊,因爲您無法控制分配器。如果你想要這個功能,你必須創建你自己的分配器。 –

+0

@Someprogrammerdude我們如何創建自己的內存分配器? – praneeth

回答

1

你無法對內存進行碎片整理,如果你想這樣做,你可以打電話給我。

我已經遇到這種情況,但我沒有現在的代碼還沒有我仍然相信,你不能這樣做,因爲這是不可能

0

我不認爲這一般可以回答,除了與「你不能」因爲實際上沒有辦法使用標準庫的堆API來執行此操作。

您可以使用特殊用途的分配器來代替標準庫,這可能會暴露更多的功能來支持堆的分段。

+0

我的朋友問我們如何測量釋放塊一起到自己的塊 – praneeth

+0

告訴我什麼是用於去碎片的特殊類型的分配器 – praneeth

+0

@praneeth這隻能在一般如果塊是相鄰的,當然,我想大多數運輸標準庫都是這樣做的。推薦軟件對於這個網站是無關緊要的,你需要自己做一些搜索。 – unwind