内存泄漏标准::矢量管理 C++
memory leak std::vector management c++
当我创建一个 50'000 值的双精度向量时,我遇到了内存泄漏,我不知道为什么。
#include <stdafx.h>
#include <Windows.h>
#include <psapi.h>
#define MEMLOGINIT double mem1, mem2;
PROCESS_MEMORY_COUNTERS_EX pmc;
GetProcessMemoryInfo(GetCurrentProcess(), (PROCESS_MEMORY_COUNTERS*)&pmc, sizeof(pmc));
SIZE_T virtualMemUsedByMe = pmc.PrivateUsage;
mem1 = virtualMemUsedByMe/1024.0;
std::cout << "1st measure n Memory used : " << mem1 <<" Ko.nn";
#define MEMLOG(stepName) GetProcessMemoryInfo(GetCurrentProcess(), (PROCESS_MEMORY_COUNTERS*)&pmc, sizeof(pmc));
virtualMemUsedByMe = pmc.PrivateUsage;
mem2 = virtualMemUsedByMe/1024.0;
std::cout << stepName << "n Memory used : " << mem2 << " Ko.n Difference with previous measure : " << mem2 - mem1 <<" Ko.nn";
mem1 = mem2;
int _tmain(int argc, _TCHAR* argv[])
{
MEMLOGINIT;
{
vector<double> spTestmemo(50000 ,100.0);
MEMLOG("measure before destruction");
}
MEMLOG("measure after destruction");
};
具有 50k 值的输出显然,这里没有释放由矢量分配的 400 ko。
但是,析构函数处理 500'000 个值的向量。
int _tmain(int argc, _TCHAR* argv[])
{
MEMLOGINIT;
{
//vector<double> spTestmemo(50000 ,100.0);
vector<double> spTestmemo(500000 ,100.0); //instead of the line above
MEMLOG("measure before destruction");
}
MEMLOG("measure after destruction");
};
具有 500K 值的输出在这里,一个比前一个大十倍的向量几乎被完全破坏(4 ko的小偏差(。
感谢您的帮助。
正如NathanOlivier和PaulMcKenzie在他们的评论中指出的那样,这不是内存泄漏。
释放 c++ std 库时,可能不会向操作系统释放所有内存,但仍会考虑内存。
因此,不要太担心操作系统报告的程序虚拟内存使用情况,只要它在程序运行时没有异常高或持续增加。
---开始特定于Visual Studio:
由于您似乎正在使用Visual Studio构建代码,因此其调试运行时库具有用于执行MEMLOGINIT和MEMLOG宏所执行的操作的工具,请参阅 https://msdn.microsoft.com/en-us/library/974tc9t1.aspx#BKMK_Check_for_heap_integrity_and_memory_leaks
基本上,您可以使用_CrtMemCheckpoint来获取已分配内容的状态,并_CrtMemDifference和_CrtMemDumpStastistics来比较和记录 2 个检查点之间的差异。
运行时库的调试版本还会在程序退出时自动将泄漏的内存转储到程序的调试器控制台。如果将 new 定义为 DEBUG_NEW它甚至会记录进行每次泄漏分配的源文件和行号。这在查找内存泄漏时通常非常有价值。
相关文章:
- 当vector是tje全局变量时,c++中vector的内存管理
- 如何维护资源管理器项目视图中当前可见的项目列表
- 如何在GTK程序运行时禁用屏幕保护程序/电源管理/屏幕消隐
- 资源管理设计模式
- 使用"Task"函数指针队列定义作业管理器
- 实现动态插件管理器
- Alt+Enter 在 Win32 应用中,管理大小调整和分辨率
- libcurl 和 DNS ttl 中的内部连接管理
- 当分配一个字符串值并稍后通过分配另一个值进行更改时C++如何管理内存?
- 在C++管理一家中国.txt
- 编译器资源管理器和 GCC 具有不同的输出
- 我们可以通过 IPC 传递具有动态管理成员的类对象吗?
- 使用 Git 处理 C++ Visual Studio 2019 解决方案的外部依赖项源代码管理的最佳方法是什么?
- Q没有管理权限的 exe 无法启动维护工具
- QT:管理来自 QNetworkReply 的回复
- 使用 std::vector<double> 访问由 std::unique_ptr<double[2] 管理的数据>
- 读取 TCP 标头并使用RAW_SOCKET管理 TCP 连接
- Windows 资源管理器中的图标在使用 resource.rc 时显示 2 个不同的图标
- 管理字符串文本的最佳做法
- 在 QNX 中,如何管理服务器和客户端之间的 IPC 连接?