gpt4 book ai didi

c++ - 内存泄漏 std::vector 管理 C++

转载 作者:搜寻专家 更新时间:2023-10-31 02:17:48 24 4
gpt4 key购买 nike

当我创建一个 50'000 值的 double vector 时发生内存泄漏,我不知道为什么。

#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.\n\n";\

#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.\n\n";\
mem1 = mem2;



int _tmain(int argc, _TCHAR* argv[])
{
MEMLOGINIT;
{
vector<double> spTestmemo(50000 ,100.0);
MEMLOG("measure before destruction");
}
MEMLOG("measure after destruction");
};

output with 50k values很明显这里vector分配的400 ko没有释放。

但是,析构函数使用包含 500'000 个值的 vector 。

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");
};

output with 500k values在这里,一个比前一个 vector 大十倍的 vector 几乎被完全破坏(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,它甚至会记录每个泄漏分配所在的源文件和行号。这在查找内存泄漏时通常非常有值(value)。

关于c++ - 内存泄漏 std::vector 管理 C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35299173/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com