我已经创建了一个示例应用程序,如下所示。我需要创建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;
}
答案 0 :(得分:7)
您的应用程序中肯定没有内存泄漏。分配之前和之后的数字似乎不匹配的原因是,为了检测C ++程序中的内存泄漏,任务管理器工具是粗略的。它不是记录代码的内存使用情况,而是记录执行代码的进程的所有内存使用情况,包括支持代码操作的标准C ++库使用的任何内存。
使用内存分析器(例如valgrind)来测试代码是否存在内存泄漏。
此外,请考虑切换用于制作容器的原始指针。到目前为止,减少内存泄漏可能性的最佳方法是使用标准C ++库中的容器自动执行内存管理。在您的情况下,定义一个向量
std::vector<testSt> testObj(1024*1024);
可以让你完全避免分配和解除分配。
答案 1 :(得分:1)
发布的代码中没有内存泄漏。任务管理器报告的内存使用情况不会回到原来的状态是进程的运行时保留了一些已分配的页面以供以后重用,因此它(希望)不必为了更多RAM而烦扰操作系统下次它想要分配一个对象。这是一个正常的优化,没什么好担心的。泄漏的真正测试是在循环中运行代码进行多次迭代;如果在该测试期间您看到您的进程的内存使用量不受限制地增加,则表明存在内存泄漏。另一方面,如果它趋于平稳然后保持不变,那表明没有一个。
答案 2 :(得分:0)
您的代码是正确的,数组将被删除。 您可以使用以下方法对此进行测试:
struct testSt
{
bool check;
std::string testString;
~testSt()
{
std::cout << "Destroyed!" << std::endl;
}
};
你是从调试器运行的吗?附加内存可以由IDE保存。