这段代码会内存泄露吗?

hailongqiu hailongqiu 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区

#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 语言中指针问题也就是内存申请与释放是一个令人头疼的事情,假如你申请了内存,但没有释放,并且你的程序需要长时间地运行,那么,系统的资源将逐渐减少,当系统的资源全部被用完时,系统将会崩溃。所以在开发程序的过程中一定要保证资源的完全释放。下面我们来介绍内存漏洞的检查。

ckhai

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

weixin_38517212

android手机测试中如何查看内存泄露

android手机测试中如何查看内存泄露

cym_hanxiao

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

weixin_38674115
评论 6
收藏 已收藏
分享
返回顶部
hailongqiu
C语言 70,040 成员 243,237 内容