当前位置: 技术问答>linux和unix
新手请教高手在linux上用c写结构体时是不是有大小限制?如何解决?
来源: 互联网 发布时间:2015-10-13
本文导语: 新手用c在linux上开发一通信规约,由于规约中的数据动态变化,现在实现是用链表,根据报文中的数据动态生成链表,解释完成后在删除链表结点,这样需频繁分配和释放空间,别人说频繁分配和释放易造成内存碎片...
新手用c在linux上开发一通信规约,由于规约中的数据动态变化,现在实现是用链表,根据报文中的数据动态生成链表,解释完成后在删除链表结点,这样需频繁分配和释放空间,别人说频繁分配和释放易造成内存碎片,容易造成系统死机,是否这样。
如果我按报文可能出现的最大数据事先定义解释后存放数据的结构体,编译通过,但调试运行时出错,该结构体太大了,地址空间出错了,无法进入。
请问高手如果用链表频繁分配和释放是否会造成程序不稳定?
如果事先定义好最大的存放空间,有何办法解决?
如果我按报文可能出现的最大数据事先定义解释后存放数据的结构体,编译通过,但调试运行时出错,该结构体太大了,地址空间出错了,无法进入。
请问高手如果用链表频繁分配和释放是否会造成程序不稳定?
如果事先定义好最大的存放空间,有何办法解决?
|
如果想防止链表出错可以用预先分配内存的方法,我在内核开发都是这样做,内存为一段连续的空间,可以作成环形,你可以在这段连续空间放置数据包结构体,注意判断是否用尽这段内存就可以了,程序结束释放掉OK
|
一、不会造成不稳定,有关的操作系统会帮你回收好垃圾并重新利用,只要你释放内存。
二、一开始定义好空间的话,可以考虑所有的指针都不用真实地址,而用相对第一个地址的偏移量
二、一开始定义好空间的话,可以考虑所有的指针都不用真实地址,而用相对第一个地址的偏移量
|
有这样的限制吗,愿闻其详.
>>如果事先定义好最大的存放空间,有何办法解决?
例:
定义标准空间SIZE = N BYTE
定义标准空间个数 = M个
一开始分配好.
用空闲队列来管理.
如果最大的存放空间 =X BYTE,则从M个中拿 N/X 个空间出来.
不用了,归还到空闲队列中去.
总的想法,一个电文可以用多个标准块来存放.
>>如果事先定义好最大的存放空间,有何办法解决?
例:
定义标准空间SIZE = N BYTE
定义标准空间个数 = M个
一开始分配好.
用空闲队列来管理.
如果最大的存放空间 =X BYTE,则从M个中拿 N/X 个空间出来.
不用了,归还到空闲队列中去.
总的想法,一个电文可以用多个标准块来存放.
|
可以自己加一套内存管理机制,第一次向管理者请求内存时分配,用完后交还给管理者待下一次请求时返回给请求者,一直到程序退出时才释放