如何分配动态内存并在重新分配后重新分配我们如何将中间释放的内存带到一个块内存
How to allocate dynamic memory and reallocate after reallocate how we bring middle freed memory to one block memory
假设 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);
}
我不认为这可以在一般情况下得到回答,除了 "you can't" 因为确实没有办法使用标准库的堆 API 来做到这一点。
您可以使用特殊用途的分配器来代替标准库的分配器,这可能会公开更多功能来支持堆的碎片整理。
你不能对内存进行碎片整理,如果你想做,你打车给我。
我遇到过这种情况,但我现在还没有代码,我仍然相信你不能这样做,因为这是不可能的
假设 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);
}
我不认为这可以在一般情况下得到回答,除了 "you can't" 因为确实没有办法使用标准库的堆 API 来做到这一点。
您可以使用特殊用途的分配器来代替标准库的分配器,这可能会公开更多功能来支持堆的碎片整理。
你不能对内存进行碎片整理,如果你想做,你打车给我。
我遇到过这种情况,但我现在还没有代码,我仍然相信你不能这样做,因为这是不可能的