【发布时间】:2019-12-19 22:30:29
【问题描述】:
这是一些我遇到困难的代码:
unsigned __stdcall Thread_GetInstallType(void *pComputerName)
{
std::vector<WCHAR> sInstallationType(10240);
INT iVal = Calculate(sInstallationType.data());
return iVal;
}
我发现std::vector<WCHAR> 分配的内存在超出范围时并不总是被释放,所以我的程序有泄漏。如果我执行.clear() 和.shrink_to_fit(),程序不会泄漏内存。所以我还不如使用 WCHAR/calloc 而不是 std::vector ???还是使用 std::vector 的最佳实践?
这里是清除/收缩不泄漏内存的代码:
unsigned __stdcall Thread_GetInstallType(void *pComputerName)
{
std::vector<WCHAR> sInstallationType(10240);
INT iVal = Calculate(sInstallationType.data());
sInstallationType.clear();
sInstallationType.shrink_to_fit();
return iVal;
}
【问题讨论】:
-
您将
std::vector<WCHAR>作为TCHAR *传递?这是如何运作的 ?你真的需要像@MaxLanghof 所要求的那样提供一个 mcve。 -
您的代码没有显示在向量上调用了
data()。帮自己一个忙,创建一个minimal, complete and verifiable example,并将其编辑到您的问题中。在那之前,我们无能为力。 -
请创建一个minimal reproducible example。您当前的代码是粗略的(指针
sInstallationType.data()在Thread_GetInstallType返回的那一刻变得无效)但任何答案都必须猜测并假设Calculate做了什么。就目前而言,您的问题无法回答。 -
它不会泄漏内存,你错了。我的猜测是您将任务管理器中的内存使用量增加误认为是内存泄漏
-
请注意,在
c++代码中释放内存(尤其是少量分配)不需要将内存释放给操作系统。您的操作系统可能需要一次返回几个 KB 的块。如果整个块不是空的,您的 CRT 就无法将其归还。归还它也是一项昂贵的操作,因此它可能不会尝试在每次删除时将其释放回操作系统。
标签: c++ memory vector memory-leaks heap-memory