c++清理内存 1.内存状态监控 实时显示物理内存/备用内存使用情况 2.单进程内存清理 清理当前进程工作集内存 3.系统级内存清理 清理备用列表、已修改页、组合列表 4.全局进程优化 强制清理所有进程的工作集 5.权限管理 启用调试权限以执行敏感操作 6.用户交互 控制台菜单操作与实时监控模式 ps:清理内存需要管理员权限 去这个目录C:\Users\wangrusheng\source\repos\CMakeProject1\out\build\x64-debug\CMakeProject1,找到exe,用管理员打开。 效果图:
step1:cmake
C:\Users\wangrusheng\source\repos\CMakeProject1\CMakeProject1\CMakeLists.txt
AI检测代码解析 cmake_minimum_required(VERSION 3.12) project(CMakeProject1)
set(CMAKE_CXX_STANDARD 20)
find_library(Ntdll_Library NAMES ntdll)
add_executable(CMakeProject1 CMakeProject1.cpp memory_cleaner.cpp memory_cleaner.h )
target_link_libraries(CMakeProject1 Psapi Advapi32 ${Ntdll_Library} )
if(MSVC) target_compile_options(CMakeProject1 PRIVATE /W4 /WX) else() target_compile_options(CMakeProject1 PRIVATE -Wall -Wextra -Werror) endif()
step2: main.cpp C:\Users\wangrusheng\source\repos\CMakeProject1\CMakeProject1\CMakeProject1.cpp
AI检测代码解析 #include "memory_cleaner.h" #include #include #include #include <conio.h>
using namespace std; using namespace MemoryUtils;
void PrintMenu() { system("cls"); cout << "==== 内存清理工具 ====\n"; cout << "1. 显示当前内存状态\n"; cout << "2. 执行内存清理\n"; cout << "3. 实时监控内存(每秒刷新)\n"; cout << "4. 退出\n"; cout << "请选择操作: "; }
void CleanMemory() { MEMORYSTATUSEX memBefore{ sizeof(MEMORYSTATUSEX) }; GlobalMemoryStatusEx(&memBefore);
if (!CleanAllProcessesWorkingSet()) {
cerr << "清理工作集失败!\n";
return;
}
CleanStandbyList();
CleanModifiedPageList();
MEMORYSTATUSEX memAfter{ sizeof(MEMORYSTATUSEX) };
GlobalMemoryStatusEx(&memAfter);
cout << "已清理内存: "
<< (memAfter.ullAvailPhys - memBefore.ullAvailPhys) / (1024 * 1024)
<< " MB\n";
}
void MonitorMemory() { while (!_kbhit()) { DisplayMemoryStatus(); this_thread::sleep_for(1s); } _getch(); // 清除键盘缓冲区 }
int main() { if (!EnableDebugPrivilege()) { cerr << "警告: 无法获取调试权限,部分清理功能可能受限!\n"; }
while (true) {
PrintMenu();
switch (_getch()) {
case '1':
DisplayMemoryStatus();
system("pause");
break;
case '2':
CleanMemory();
system("pause");
break;
case '3':
MonitorMemory();
break;
case '4':
return 0;
default:
cerr << "无效选项!\n";
this_thread::sleep_for(1s);
}
}
}
step3: clear.h C:\Users\wangrusheng\source\repos\CMakeProject1\CMakeProject1\memory_cleaner.h
AI检测代码解析 #ifndef MEMORY_CLEANER_H #define MEMORY_CLEANER_H
#include <windows.h>
// 定义 NTSTATUS 类型 #ifndef NTSTATUS typedef LONG NTSTATUS; #endif
// 定义 NT_SUCCESS 宏 #ifndef NT_SUCCESS #define NT_SUCCESS(Status) (((NTSTATUS)(Status)) >= 0) #endif
typedef enum _SYSTEM_MEMORY_LIST_COMMAND { MemoryPurgeStandbyList = 1, MemoryPurgeLowPriorityStandbyList, MemoryPurgeModifiedPageList, MemoryPurgeCombinedPageList } SYSTEM_MEMORY_LIST_COMMAND;
#define SystemMemoryListInformation 80
#ifdef __cplusplus extern "C" { #endif
NTSTATUS NTAPI NtSetSystemInformation(
_In_ INT SystemInformationClass,
_Inout_ PVOID SystemInformation,
_In_ ULONG SystemInformationLength
);
#ifdef __cplusplus } #endif
namespace MemoryUtils { void DisplayMemoryStatus(); bool CleanWorkingSet(); bool CleanStandbyList(bool clearLowPriority = false); bool CleanModifiedPageList(); bool CleanCombinedPageList(); bool CleanAllProcessesWorkingSet(); bool EnableDebugPrivilege(); }
#endif // MEMORY_CLEANER_H
step4:clear.cpp C:\Users\wangrusheng\source\repos\CMakeProject1\CMakeProject1\memory_cleaner.cpp
AI检测代码解析 #include "memory_cleaner.h" #include #include <psapi.h> #include <tlhelp32.h>
using namespace std;
// 声明函数指针类型 typedef NTSTATUS(NTAPI* PNtSetSystemInformation)( In INT SystemInformationClass, Inout PVOID SystemInformation, In ULONG SystemInformationLength );
// 全局函数指针 static PNtSetSystemInformation NtSetSystemInformationPtr = nullptr;
// 初始化函数指针 static bool InitializeNtFunction() { HMODULE hNtdll = GetModuleHandleW(L"ntdll.dll"); if (hNtdll) { NtSetSystemInformationPtr = (PNtSetSystemInformation)GetProcAddress(hNtdll, "NtSetSystemInformation"); return (NtSetSystemInformationPtr != nullptr); } return false; }
bool MemoryUtils::EnableDebugPrivilege() { HANDLE hToken; if (!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken)) return false;
TOKEN_PRIVILEGES tp;
LUID luid;
if (!LookupPrivilegeValue(nullptr, SE_DEBUG_NAME, &luid)) {
CloseHandle(hToken);
return false;
}
tp.PrivilegeCount = 1;
tp.Privileges[0].Luid = luid;
tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
if (!AdjustTokenPrivileges(hToken, FALSE, &tp, sizeof(TOKEN_PRIVILEGES), nullptr, nullptr)) {
CloseHandle(hToken);
return false;
}
CloseHandle(hToken);
return true;
}
void MemoryUtils::DisplayMemoryStatus() { MEMORYSTATUSEX memStatus; memStatus.dwLength = sizeof(MEMORYSTATUSEX); GlobalMemoryStatusEx(&memStatus);
cout << "物理内存使用: "
<< (memStatus.ullTotalPhys - memStatus.ullAvailPhys) / (1024ULL * 1024 * 1024) << " GB / "
<< memStatus.ullTotalPhys / (1024ULL * 1024 * 1024) << " GB ("
<< memStatus.dwMemoryLoad << "%)\n";
cout << "备用内存列表: "
<< memStatus.ullAvailExtendedVirtual / (1024ULL * 1024) << " MB\n";
}
bool MemoryUtils::CleanWorkingSet() { return EmptyWorkingSet(GetCurrentProcess()); }
bool MemoryUtils::CleanStandbyList(bool clearLowPriority) { if (!NtSetSystemInformationPtr && !InitializeNtFunction()) { return false; }
SYSTEM_MEMORY_LIST_COMMAND command = clearLowPriority ?
MemoryPurgeLowPriorityStandbyList : MemoryPurgeStandbyList;
NTSTATUS status = NtSetSystemInformationPtr(
SystemMemoryListInformation,
&command,
sizeof(SYSTEM_MEMORY_LIST_COMMAND)
);
return NT_SUCCESS(status);
}
bool MemoryUtils::CleanModifiedPageList() { if (!NtSetSystemInformationPtr && !InitializeNtFunction()) { return false; }
SYSTEM_MEMORY_LIST_COMMAND command = MemoryPurgeModifiedPageList;
NTSTATUS status = NtSetSystemInformationPtr(
SystemMemoryListInformation,
&command,
sizeof(SYSTEM_MEMORY_LIST_COMMAND)
);
return NT_SUCCESS(status);
}
bool MemoryUtils::CleanCombinedPageList() { if (!NtSetSystemInformationPtr && !InitializeNtFunction()) { return false; }
SYSTEM_MEMORY_LIST_COMMAND command = MemoryPurgeCombinedPageList;
NTSTATUS status = NtSetSystemInformationPtr(
SystemMemoryListInformation,
&command,
sizeof(SYSTEM_MEMORY_LIST_COMMAND)
);
return NT_SUCCESS(status);
}
bool MemoryUtils::CleanAllProcessesWorkingSet() { HANDLE hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); if (hProcessSnap == INVALID_HANDLE_VALUE) return false;
PROCESSENTRY32 pe32;
pe32.dwSize = sizeof(PROCESSENTRY32);
if (!Process32First(hProcessSnap, &pe32)) {
CloseHandle(hProcessSnap);
return false;
}
do {
if (pe32.th32ProcessID == 0) continue;
HANDLE hProcess = OpenProcess(
PROCESS_QUERY_INFORMATION | PROCESS_SET_QUOTA | PROCESS_VM_OPERATION | PROCESS_VM_READ,
FALSE,
pe32.th32ProcessID);
if (hProcess) {
EmptyWorkingSet(hProcess);
CloseHandle(hProcess);
}
} while (Process32Next(hProcessSnap, &pe32));
CloseHandle(hProcessSnap);
return true;
}
step5:选择全部重新生成 step6,直接运行 step7:关掉控制台,C:\Users\wangrusheng\source\repos\CMakeProject1\out\build\x64-debug\CMakeProject1 在这个目录,找到exe文件,管理员权限打开,输入1显示内存,输入2,清理内存 end 文章来源:ximaonetwork.cn