为此,我使用realloc函数,但它肯定不会返回与我的第一个分配位置相同的内存地址。
void *vp1 = realloc(vp, 1);我要vp1总是等于vp。
编辑:
实际上,我试图用销毁的对象使用它们的第一个字节来标记它们,并释放内存的其余部分。
发布于 2017-11-28 15:09:56
不,C标准没有提供这样的保证。
引用C11,第7.22.3.5节(强调地雷)
realloc函数返回指向新对象的指针(它的值可能与指向旧对象的指针相同),如果无法分配新对象,则返回空指针。
它提到,新返回的指针“可能”指向旧位置(根据请求调整内存边界),但不能保证。
发布于 2017-11-28 15:29:29
malloc、realloc和free的工作细节,C不作任何保证。实现可能使释放的内存可用于其他用途,也可能不会使其可用,而实现通常不为它们的工作方式提供逐字节保证。他们可能会对大量内存是否被重用、是否返回到操作系统等做出广泛的陈述。realloc返回不同的地址这一事实并不意味着它没有为其他用途释放内存。事实上,有些管理内存的方法可能会针对不同的大小使用不同的技术。可以通过从操作系统请求它们并将它们释放回操作系统来管理整个页面,而中等大小的分配可以通过链接列表和附加数据结构在进程内部进行管理,而微小的分配可以通过位图来管理。因此,请求较小的大小可能需要释放一个分配回内存池的一个类的大小,并从池中为较小的大小分配新的内存量。我对最后一个问题表示怀疑,即您将四个字节重新分配到一个字节时所发生的事情,但如果不是解释,那么内存管理器麻烦地更改分配似乎效率低下。如果您有四个并且想要一个,而它实际上并不单独管理它们,那么实际的解决方案就是保持整个分配不变。除了为其分配字节的位图之外,几乎任何东西都必须使用多个字节来跟踪一个字节的分配。
发布于 2017-11-29 18:59:56
在大多数情况下,当试图重新分配大量内存时,realloc函数会将所有数据移动到一个新的指定空间,因此,除了指针是realloc'd之外,您还会丢失来自前一个块的所有引用--如果有其他指针指向该结构,这将是一个大问题。
正如其他答案所指出的,realloc函数被标记为“未定义的行为”,良好的编程实践表明,您应该始终避免使用realloc,而应该使您自己的函数一致地在内存中移动数据。
https://stackoverflow.com/questions/47534780
复制相似问题