- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
释放通过 mremap(2)
更改的内存的规则是什么?实验表明,如果传递给 mremap()
的地址与返回的地址相同,则 free()
将起作用。但如果返回的地址不同,free()
将产生一个段错误。例如,
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#define __USE_GNU
#include <sys/mman.h>
#define ALLOC_SIZE (1024 * 1024)
int
main(int argc, char *argv[])
{
void *m = NULL, *tmp;
size_t size = 4 * ALLOC_SIZE;
m = memalign(4096, size);
if (m == NULL)
return EXIT_FAILURE;
tmp = mremap(m, size, size + ALLOC_SIZE, MREMAP_MAYMOVE);
if (tmp == MAP_FAILED) {
printf("mremap(%p, %zu, %zu, MREMAP_MAYMOVE) failed\n",
m, size, size+ALLOC_SIZE);
} else {
if (tmp != m) {
printf("Memory moved from %p to %p\n", m, tmp);
m = tmp;
}
size += ALLOC_SIZE;
}
printf("Freeing %zu bytes from %p\n", size, m);
free(m);
return EXIT_SUCCESS;
}
将出现段错误,除非
MREMAP_MAYMOVE
已删除free
改为 munmap
如果答案是不使用 memalign
系列函数,而是使用 mmap
匿名内存,您能否指出说明是这种情况的手册页或类似内容?
最佳答案
免费的手册页(man 3 free
):
The free() function frees the memory space pointed to by ptr, which must have been returned by a previous call to malloc(), calloc(), or realloc(). Otherwise, or if free(ptr) has already been called before, undefined behavior occurs.
基本上,在不是由 malloc 系列分配的内存上使用 free 是未定义的。由于您使用 mremap 作为分配内存的最后一个函数,因此它不是 malloc 分配的内存。
你必须在 mremap 之后在这里使用 munmap。此外,您不应该将 malloc 系列与 mmap 系列混合使用。那只是灾难的根源。
关于c - 从 mremap 段错误中释放内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48469985/
我已经写了下面的代码,但是代码仍然给我发送EEERROR信息,告诉我mremap扩展内存失败。 int main() { int size_of_mem = 1024 int fd = shm_ope
我需要一种将页面从一个虚拟地址范围复制到另一个而不实际复制数据的方法。范围很大,延迟很重要。 mremap 可以做到这一点,但问题是它也会删除旧的映射。由于我需要在多线程环境中执行此操作,因此我需要同
释放通过 mremap(2) 更改的内存的规则是什么?实验表明,如果传递给 mremap() 的地址与返回的地址相同,则 free() 将起作用。但如果返回的地址不同,free() 将产生一个段错误。
我正在尝试使用 malloc 分配两个不同的 4096 字节,并使用不同的值初始化这些分配。之后,我希望其中一个指针指向另一个分配“而不”更改 p1 的值和“不”复制数据。我想将第二个分配“重新映射”
我有一个 C 代码,我知道 void *p1 指向的页面内容与 page void *p2 指向的内容相同。 p1 和 p2 是动态分配的。我的问题是我可以使用 remap() 让这两个页面指向同一个
如果我mmap() 一些PRIVATE 和ANONYMOUS 页面然后使用mremap() 扩展它们,新空间是否也被初始化为零? 我已经尝试阅读 linux 源代码中的 mremap (mm/mrem
我一直在试验 mremap()。我希望能够高速移动虚拟内存页面。至少比复制它们的速度更高。我对算法有一些想法,可以利用能够非常快速地移动内存页面。问题是下面的程序显示 mremap() 非常慢 - 至
根据 Linux man page和 POSIX spec ,只要未提供 MAP_FIXED 标志,mmap 就不会在地址 0 放置新映射。 Linux的mremap也是如此? REMAP_FIXED
我在我的一个程序中使用了 mmap()ed 内存。一个问题是 mmap()ed 内存不是 \0 终止的(当它是页面大小的倍数时)。因此,为了确保它是 \0 终止的,我考虑使用 Linux 特定的 mr
据我了解,要在 Linux 中保留一 block 虚拟内存,您可以使用 MAP_ANONYMOUS 和 MAP_PRIVATE 调用 mmap,以及等效的Windows 上的系统调用是 Virtual
是 void * mremap(void *old_address, size_t old_size , size_t new_size, unsigned long flags); 与 malloc
我目前正在学习 C,并试图扩展结构数组的可用内存量。当我尝试增加数组时,我在运行时收到以下错误 malloc.c:2852: mremap_chunk: Assertion `((size + off
下面的代码开始 mmap(initlen=10),然后是 remap(nsize=400000) 并访问 remap 内存地址访问0x7ffff7f8c000到0x7ffff7f8cfff是可以的,但
我正在尝试重现 mremap 的工作以增加 mmap 的内存/文件。我大致关注了this example但它是为匿名映射而设计的,而我希望它是一个命名文件(这是一个编程语言解释器,所以这个文件相当于解
我将一些数据存储在多个进程使用的共享内存数组中。在某些时候,我想扩大阵列。 假设进程之间已经有同步机制 最初,进程 1 将创建段,进程 2 将打开它。 过程1 shm_open() O_CREATft
Linux mremap(2) 函数是否可以将从 mmap() 获得的 HugeTLB 的虚拟地址更改为新的固定虚拟地址? (背景:我想根据我得到的内存的物理地址重新映射虚拟地址。这是通过直接检查指针
所以我想使用 mremap 函数来更轻松地处理内存映射文件,但是引发了隐式声明错误 addr = mremap(addr, len, len_file, MREMAP_MAYMOVE); 我确实包含了
有没有办法分配一 block 内存,使其起始地址与给定的页面大小对齐?请注意,我不想在分配 block 后计算对齐地址。原因是在某些时候我将不得不在 block 上调用 mremap():mremap
我已经将 Realm 实现为我的数据库,并且在我的应用程序中我在电话联系人上运行一项服务以检查我的电话簿中的任何更改。该服务适用于大约 3 到 4 个更改,然后应用程序崩溃并在我的 logcat 中显
我是一名优秀的程序员,十分优秀!