没有可移植的方法来确定给定指针是否有效。你必须知道你正在处理什么样的记忆系统。根据操作系统和处理器,可能有也可能没有查询虚拟内存管理器的页表以确定指针的有效范围的方法。
例如,在 Linux 上,您可以检查下面的特殊mmap
文件/proc
以获取进程的虚拟内存映射。下面是一个cat
读取它自己的内存映射的例子:
$猫/proc/self/mmap
08048000-0804c000 r-xp 00000000 09:00 5128276 /bin/cat
0804c000-0804d000 rw-p 00003000 09:00 5128276 /bin/cat
0804d000-0806e000 rw-p 0804d000 00:00 0 [堆]
f7ca7000-f7e40000 r--p 00000000 09:00 3409654 /usr/lib/locale/locale-archive
f7e40000-f7e41000 rw-p f7e40000 00:00 0
f7e41000-f7f68000 r-xp 00000000 09:00 2654292 /lib/tls/i686/cmov/libc-2.3.6.so
f7f68000-f7f6d000 r--p 00127000 09:00 2654292 /lib/tls/i686/cmov/libc-2.3.6.so
f7f6d000-f7f6f000 rw-p 0012c000 09:00 2654292 /lib/tls/i686/cmov/libc-2.3.6.so
f7f6f000-f7f72000 rw-p f7f6f000 00:00 0
f7f83000-f7f85000 rw-p f7f83000 00:00 0
f7f85000-f7f9a000 r-xp 00000000 09:00 2637871 /lib/ld-2.3.6.so
f7f9a000-f7f9c000 rw-p 00014000 09:00 2637871 /lib/ld-2.3.6.so
ff821000-ff836000 rw-p 7ffffffea000 00:00 0 [堆栈]
ffffe000-fffff000 r-xp ffffe000 00:00 0 [vdso]
您可以看到有效指针的范围,以及指示内存是否为 (r) 可读、 (w) 可写、 e(x) 可执行或 (p) 可重新发送(即未分页到磁盘)的位。