新的内存消耗然后删除

r.k*_*.kr 4 c++ memory windows memory-leaks

我创建了一个示例应用程序,如下所示.我需要创建1024*1024结构.在调用new操作符之前,我的应用程序正在消耗一些内存(比如0.3mb).调用新运算符后,内存增加(比如175mb).在调用delete操作符后,内存减少(比如15mb).所以最后存在差异.我从任务管理器中观察了所有这些内存细节.我很困惑它是否应该被视为内存泄漏,还是内存缓慢释放?如果没有,我如何释放剩余的记忆?

struct testSt
{
    bool        check;
    std::string testString; 

};

int main()
{
    testSt *testObj = new testSt[1024 * 1024];
    delete[] testObj;

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

das*_*ght 7

您的应用程序中肯定没有内存泄漏.分配之前和之后的数字似乎不匹配的原因是,为了检测C++程序中的内存泄漏,任务管理器工具是粗略的.它不是记录代码的内存使用情况,而是记录执行代码的进程的所有内存使用情况,包括支持代码操作的标准C++库使用的任何内存.

使用内存分析器(如valgrind)来测试代码是否存在内存泄漏.

另外,请考虑切换用于制作容器的原始指针.到目前为止,减少内存泄漏可能性的最佳方法是使用标准C++库中的容器自动执行内存管理.在您的情况下,定义一个向量

std::vector<testSt> testObj(1024*1024);
Run Code Online (Sandbox Code Playgroud)

会让你完全避免分配和解除分配.

  • 值得注意的是,删除并不一定会将内存返回给操作系统,而是将其保留以供以后分配(需要来源,但这是我的经验). (4认同)
  • @OMGtechy这是完全正确的.我试图在第一段的最后一句中以不太具体的术语暗示"标准C++库支持代码操作的内存".通常,内存分配器往往不会放弃所有内存,或者至少不会立即全部放弃.他们的运作假设如果你以前要求记忆,你可能会再次要求记忆,所以他们保持一个"私人藏匿"方便. (2认同)