user-0 提问: 关于free的溢出问题

回复:
user: user-0
content: 引用 15 楼 coding_hello 的回复:[quote=引用 13 楼 qq_24935843 的回复:] [quote=引用 9 楼 lm_whales 的回复:] 想做内存池，就是自己做个分配函数 缺省只有 realloc 函数可以重新分配内存，但是不会释放局部内存 这个函数，会在可能的情况下，扩展，或者缩减所用内存的大小， 当本快内存不够的时候，会分配新的内存，替换原来的那块，然后数据搬迁过去。 这个函数也可能失败  我在网上查了资料，realloc貌似不能减少空间啊？他的第二个参数是unsigned。。。  我现在是这样的，我现在就是做一个这样的东西，一开始的时候分配一个较大的区域，  然后开始的时候把输入的数据填充到区域的开端（连续的），然后把不用的那部分区间看成是未使用区，在后续的操作中可以往未使用区中写入数据（相当于后面的未使用区是一个储存区，储存中间变量，中间某些运算结束后前面使用区的前面数据可以扔掉），然后当未使用区不够的时候我再把整块数据往前移动直到块的开头，再使用后面的区域。。。  这样的分配效率如何？[/quote]   麻烦，直接搞个环形队列吧，在两头操作，没相遇以前都ok,相遇了说明分配的还不够大[/quote]  谢谢，环形队列我已经做好了，其实还有个关于算法的问题，我另行开贴吧，给分啦

user: user-0
content: 引用 15 楼 coding_hello 的回复:[quote=引用 13 楼 qq_24935843 的回复:] [quote=引用 9 楼 lm_whales 的回复:] 想做内存池，就是自己做个分配函数 缺省只有 realloc 函数可以重新分配内存，但是不会释放局部内存 这个函数，会在可能的情况下，扩展，或者缩减所用内存的大小， 当本快内存不够的时候，会分配新的内存，替换原来的那块，然后数据搬迁过去。 这个函数也可能失败  我在网上查了资料，realloc貌似不能减少空间啊？他的第二个参数是unsigned。。。  我现在是这样的，我现在就是做一个这样的东西，一开始的时候分配一个较大的区域，  然后开始的时候把输入的数据填充到区域的开端（连续的），然后把不用的那部分区间看成是未使用区，在后续的操作中可以往未使用区中写入数据（相当于后面的未使用区是一个储存区，储存中间变量，中间某些运算结束后前面使用区的前面数据可以扔掉），然后当未使用区不够的时候我再把整块数据往前移动直到块的开头，再使用后面的区域。。。  这样的分配效率如何？[/quote]   麻烦，直接搞个环形队列吧，在两头操作，没相遇以前都ok,相遇了说明分配的还不够大[/quote]  这样好像也不错，我试试

user: user-1
content: 引用 13 楼 qq_24935843 的回复:[quote=引用 9 楼 lm_whales 的回复:] 想做内存池，就是自己做个分配函数 缺省只有 realloc 函数可以重新分配内存，但是不会释放局部内存 这个函数，会在可能的情况下，扩展，或者缩减所用内存的大小， 当本快内存不够的时候，会分配新的内存，替换原来的那块，然后数据搬迁过去。 这个函数也可能失败  我在网上查了资料，realloc貌似不能减少空间啊？他的第二个参数是unsigned。。。  我现在是这样的，我现在就是做一个这样的东西，一开始的时候分配一个较大的区域，  然后开始的时候把输入的数据填充到区域的开端（连续的），然后把不用的那部分区间看成是未使用区，在后续的操作中可以往未使用区中写入数据（相当于后面的未使用区是一个储存区，储存中间变量，中间某些运算结束后前面使用区的前面数据可以扔掉），然后当未使用区不够的时候我再把整块数据往前移动直到块的开头，再使用后面的区域。。。  这样的分配效率如何？[/quote]   麻烦，直接搞个环形队列吧，在两头操作，没相遇以前都ok,相遇了说明分配的还不够大

user: user-2
content: pmemory.freetail 是结构体中的元素，free的内容应该是指针类型的，个人见解，如果不对，还请指出

user: user-0
content: 引用 9 楼 lm_whales 的回复:想做内存池，就是自己做个分配函数 缺省只有 realloc 函数可以重新分配内存，但是不会释放局部内存 这个函数，会在可能的情况下，扩展，或者缩减所用内存的大小， 当本快内存不够的时候，会分配新的内存，替换原来的那块，然后数据搬迁过去。 这个函数也可能失败  我在网上查了资料，realloc貌似不能减少空间啊？他的第二个参数是unsigned。。。  我现在是这样的，我现在就是做一个这样的东西，一开始的时候分配一个较大的区域，  然后开始的时候把输入的数据填充到区域的开端（连续的），然后把不用的那部分区间看成是未使用区，在后续的操作中可以往未使用区中写入数据（相当于后面的未使用区是一个储存区，储存中间变量，中间某些运算结束后前面使用区的前面数据可以扔掉），然后当未使用区不够的时候我再把整块数据往前移动直到块的开头，再使用后面的区域。。。  这样的分配效率如何？

user: user-0
content: 引用 8 楼 coding_hello 的回复:不能从中间位置free，操作系统有堆管理，不认识你给的这个地址  谢谢解答

user: user-3
content: 只有你的内存， 自己管理比缺省的内存管理做得好， 才需要自己分配内存

user: user-3
content: 自己分配内存的作用， 就是用较少的代价， 频繁分配释放内存，而缺省的方式代价比较高

user: user-3
content: 想做内存池，就是自己做个分配函数 缺省只有 realloc 函数可以重新分配内存，但是不会释放局部内存 这个函数，会在可能的情况下，扩展，或者缩减所用内存的大小， 当本快内存不够的时候，会分配新的内存，替换原来的那块，然后数据搬迁过去。 这个函数也可能失败

user: user-1
content: 不能从中间位置free，操作系统有堆管理，不认识你给的这个地址

user: user-0
content: 引用 6 楼 gojoy_x13 的回复:一般malloc在返回用户申请的空间大小时，会预留一部分空间存储申请信息(size，type等)位于返回当前指针的前，free调用首先读取这些信息，那么你从中间开始free，读不到那些信息，会异常吧~~ http://blog.jobbole.com/82511/  原来是这样，我开始以为malloc仅仅是会返回一个指针而已。。

user: user-4
content: 一般malloc在返回用户申请的空间大小时，会预留一部分空间存储申请信息(size，type等)位于返回当前指针的前，free调用首先读取这些信息，那么你从中间开始free，读不到那些信息，会异常吧~~ http://blog.jobbole.com/82511/

user: user-0
content: 引用 3 楼 user-5 的回复:[quote=引用 2 楼 qq_24935843 的回复:] [quote=引用 1 楼 user-5 的回复:] 报的什么错、？ Invalid Address specified to RtlValidateHeap[/quote] 你是不是在用别人的dll。或许是你的两个模块用了不同的运行时库（Runtime Library）  你调试一下， free(pmemory.freetail);        的时候freetail的值是不是有效的？[/quote]   而且就算我调试看了下pmemory.freetail，他是有东西的，比如这个时候他是如图所示的数据，但是free的时候就是出错  是不是只能free内存空间头，而不能free中间的？

user: user-0
content: 引用 3 楼 user-5 的回复:[quote=引用 2 楼 qq_24935843 的回复:] [quote=引用 1 楼 user-5 的回复:] 报的什么错、？ Invalid Address specified to RtlValidateHeap[/quote] 你是不是在用别人的dll。或许是你的两个模块用了不同的运行时库（Runtime Library）  你调试一下， free(pmemory.freetail);        的时候freetail的值是不是有效的？[/quote]  没，都是自己写的东西，freetial的指向应该没越位。。。就是没初始化。。会不会有影响

user: user-5
content: 引用 2 楼 qq_24935843 的回复:[quote=引用 1 楼 user-5 的回复:] 报的什么错、？ Invalid Address specified to RtlValidateHeap[/quote] 你是不是在用别人的dll。或许是你的两个模块用了不同的运行时库（Runtime Library）  你调试一下， free(pmemory.freetail);        的时候freetail的值是不是有效的？

user: user-0
content: 引用 1 楼 user-5 的回复:报的什么错、？ Invalid Address specified to RtlValidateHeap

user: user-5
content: 报的什么错、？