【问题标题】:std::vector<WCHAR> not freeing memory automatically in C++ [closed]std::vector<WCHAR> 不会在 C++ 中自动释放内存 [关闭]
【发布时间】: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&lt;WCHAR&gt; 分配的内存在超出范围时并不总是被释放,所以我的程序有泄漏。如果我执行.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&lt;WCHAR&gt; 作为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


【解决方案1】:

您没有显示Calculate 的代码(也没有显示您的函数的调用方式)。 Calculate 或您的调用代码完全有可能包含未定义的行为,此时 所有赌注都关闭,这可能通过一些疯狂的间接影响导致内存从 @987654323 泄漏@。

但这太牵强了。如图所示,代码不会泄漏内存。自动运行的析构函数将释放它。

【讨论】:

    猜你喜欢
    • 2023-03-22
    • 1970-01-01
    • 1970-01-01
    • 2014-11-19
    • 1970-01-01
    • 2017-02-19
    • 2014-09-12
    • 2018-09-25
    • 2018-07-06
    相关资源
    最近更新 更多