这段代码会内存泄露吗?
#include <stdio.h>
#include <stdlib.h>
struct mblock
{
struct mblock *next; // 指向堆中下一个内存块的指针.
char *start; //内存块起始.
char *end; //内存块结束.
char *avail; //可用内存块.
};
typedef struct heap
{
struct mblock head; // 内存块的头.
struct mblock *last; // 内存块的尾.
}*Heap;
static struct mblock *free_blocks;
struct heap string_heap;
#define MBLOCK_SIZE (4 * 1024)
// 字节对齐.
#define ALIGN_SIZE 8
#define ALIGN(size, align) ((size + align - 1) & (~(align - 1)))
void init_heap(Heap hp);
void init_heap(Heap hp)
{
hp->head.next = NULL;
hp->head.start = hp->head.end = hp->head.avail;
hp->last = &hp->head;
}
void *heap_allocate(Heap hp, int size)
{
struct mblock *blk = NULL;
// 字节对齐.
size = ALIGN(size, ALIGN_SIZE);
blk = hp->last;
// 申请的大小 > 尾巴 - 可用的空间.
puts("-------------------");
while (size > blk->end - blk->avail)
{
puts("fjdffk");
if ((blk->next = free_blocks) != NULL)
{
printf("exit...");
}
else
{
puts("-------------------333");
int m = size + MBLOCK_SIZE + sizeof(struct mblock);
blk->next = (struct mblock*)malloc(m);
blk = blk->next;
if (blk == NULL)
{
}
blk->end = (char*)blk + m;
}
blk->avail = blk->start = (char*)(blk + 1);
blk->next = NULL;
hp->last = blk;
puts("-------------------4444");
}
puts("-------------------222");
blk->avail += size;
return blk->avail - size;
}
void free_heap(Heap hp)
{
hp->last->next = free_blocks;
free_blocks = hp->head.next;
init_heap(hp);
}
int main(int argc, char *argv[])
{
init_heap(&string_heap);
struct x
{
int x1;
int y1;
int a;
int b;
};
struct x *p = heap_allocate(&string_heap, 100);
p->x1 = 3;
p->y1 = 4;
printf("%d\n", p->x1);
free_heap(&string_heap);
return 0;
}
相关推荐
12个有趣的C语言面试题
12个有趣的C语言面试题-
VC编程中有关内存泄露检查方法
在C++和C 语言中指针问题也就是内存申请与释放是一个令人头疼的事情,假如你申请了内存,但没有释放,并且你的程序需要长时间地运行,那么,系统的资源将逐渐减少,当系统的资源全部被用完时,系统将会崩溃。所以在开发程序的过程中一定要保证资源的完全释放。下面我们来介绍内存漏洞的检查。
Android 中Handler引起的内存泄露
在Android常用编程中,Handler在进行异步操作并处理返回结果时经常被使用。通常我们的代码会这样实现。 public class SampleActivity extends Activity { private final Handler mLeakyHandler = new Handler() { @Override public void handleMessage(Message msg) { // ... } } } 但是,其实上面的代码可能导致内存泄露,当你使用Android lint工具的话,会得到这样的警告 In Android, Handler c
android手机测试中如何查看内存泄露
android手机测试中如何查看内存泄露
Javascript 闭包引起的IE内存泄露分析
代码如下: function fors(){ obj_a = obj_b; obj_b.attr = obj_a; } 代码如下: function fors(){ obj_b = {}; obj_b.attr = obj_b; } 上面是两个个很显示的循环引用,IE中产生了内存泄露,由于IE的内存回收机制,导至会长期占用内存而不能释放。 但闭包的内存泄露,有些隐蔽。因为闭包的循环引用,是间接的。 代码如下: function iememery(){ var js_obj = document.createElement(“div”); js_obj.oncontextmenu = f


