内存可用性判断

程序异常崩溃,多数是有内存访问异常引起。为定位崩溃位置通常考虑加强内存访问控制,如此有必要进行内存可用性判断,从《Windows核心编程》中看到内存指针的可用性判断方法,感觉还不错,此处记录下。

判断内存指针的可用性,是通过判断指针所指向的虚拟内存页面的状态和属性来实现的。Windows提供了相关的API。相同的功能也可以通过获取虚拟内存页面属性来判断。

1)IsBadCodePtr:

判断调用进程是否拥有对指定地址内存的读操作权限,函数原型如下:

BOOL WINAPI IsBadCodePtr(

__inFARPROC lpfn//指定的内存地址

);

返回值表示当前进程是否拥有对该地址内存的读取权限。

2)IsBadReadPtr:

判断调用进程是否拥有对指定地址段内存的读操作权限,函数原型如下:

BOOL WINAPI IsBadReadPtr(

__inconstVOID *lp,//指定起始内存地址

__inUINT_PTR ucb//从起始内存地址开始的内存块长度

);

返回值表示当前进程是否拥有对该段地址内存块的读取权限。

3)IsBadStringPtr:

判断调用进程是否拥有对指定字符串指针的读取权限,函数原型如下:

BOOL WINAPI IsBadStringPtr(

__inLPCTSTR lpsz,//指向字符串的指针

__inUINT_PTR ucchMax//读取字符串的最大长度

);

返回值表示当前进程是否拥有字符串指针指向的字符串的读取权限。

4)IsBadWritePtr:

判断调用进程是否拥有对指定地址段内存的写操作权限,函数原型如下:

BOOL WINAPI IsBadWritePtr(

__inLPVOID lp,//指向起始内存地址

__inUINT_PTR ucb//从起始内存地址开始的内存块长度

);

返回值表示当前进程是否拥有该段地址内存块的写入权限。

转载于:https://my.oschina.net/tocy/blog/168973

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在C语言中,直接获取计算机的物理内存信息通常是系统级别的操作,不是标准库提供的功能。然而,你可以使用一些特定于平台的API或者第三方库来实现这个功能,例如在Windows平台上可以使用`Windows API`中的`GlobalMemoryStatusEx`函数,而在Linux或Unix-like系统上可以使用`/proc/meminfo`文件。 这里提供一个基本的Windows示例,使用Win32 API,但请注意这需要编译为Windows可执行文件: ```c #include <windows.h> #include <stdio.h> void GetSystemMemoryInfo() { MEMORYSTATUSEX memStat; memStat.dwLength = sizeof(MEMORYSTATUSEX); GlobalMemoryStatusEx(&memStat); DWORD availableMB = memStat.ullAvailPhys / (1024 * 1024); // MB printf("Available physical memory: %.1f MB\n", availableMB); } int main() { if (GetSystemMemoryInfo()) { return 0; } else { printf("Failed to get system memory information.\n"); return 1; } } ``` 在Linux或Unix-like系统上,你需要读取`/proc/meminfo`文件,这通常涉及到I/O和字符串处理,代码会稍微复杂些。下面是一个简化的示例,实际操作可能需要链接到`sys/sysctl.h`或使用类似`libudev`的库: ```c #include <stdio.h> #include <unistd.h> #include <fcntl.h> #include <sys/ioctl.h> #include <linux/hwinfo.h> // Linux-specific for querying memory int main() { int fd = open("/proc/meminfo", O_RDONLY); if (fd == -1) { perror("Failed to open /proc/meminfo"); return 1; } char buffer[1024]; ssize_t bytes_read = read(fd, buffer, sizeof(buffer)); if (bytes_read <= 0) { perror("Failed to read /proc/meminfo"); close(fd); return 1; } close(fd); // Extract available memory line and convert to MB char* memline = strstr(buffer, "MemFree:"); if (memline) { size_t memfree_idx = memline + strlen("MemFree:"); memline += memfree_idx; // Skip ':' long memfree_in_bytes = strtol(memline, NULL, 10); long availableMB = memfree_in_bytes / (1024 * 1024); printf("Available memory: %.1f MB\n", availableMB); } else { printf("Failed to find MemFree line in /proc/meminfo.\n"); } } ``` 这些代码示例都需要编译时链接到对应的库,并且在实际环境中可能需要处理异常情况。由于跨平台支持的复杂性,如果你在生产环境中使用,可能需要封装成更健壮的库函数或者使用第三方库。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值