【问题标题】:memory committed remains the same after all things are cleared [closed]清除所有内容后,提交的内存保持不变[关闭]
【发布时间】:2017-04-28 05:16:57
【问题描述】:

我有一个 GUI 应用程序,其中包含一个用于显示大量模拟蚂蚁的 CView。

我创建了一个 shared_ptr 向量来保存模拟控制器(如果我打算打开更多视图,有很多)。每个控制器都包含许多循环依赖的 shared_ptr。

当我开始我的模拟时,我打开我的任务管理器并看到程序内存增加,直到程序停止(例如 3000MB)。我关闭所有视图并调用创建的 Reset 方法来清除所有用于存储输入和输出数据的容器或向量以及控制器。然而,我仍然看到 3000MB 没有变回 3MB 或任何其他类似的较小数字,例如。

我有内存泄漏吗?因为如果我再次开始运行我的模拟,所提交或使用的内存会变成越来越大的数字,而我认为应该在调用清除方法后立即将其重置为可能的最低数字。

【问题讨论】:

  • 请发布代码。例如,“调用创建的 Reset 方法来清除所有用于存储输入和输出数据的容器或向量以及控制器”并没有真正告诉我们任何事情,除了你认为你正在做的事情会释放和取消提交内存.

标签: c++ winapi mfc


【解决方案1】:

循环共享指针最终不会被删除。考虑以下几点:

struct Foo {
    std::shared_ptr<Foo> m_foo;
}

std::shared_ptr<Foo> foo1 = std::make_shared<Foo>();
std::shared_ptr<Foo> foo2 = std::make_shared<Foo>();

foo1.m_foo = foo2;
foo2.m_foo = foo1;

毕竟,foo1foo2 指向并拥有彼此。因此,两个共享指针都不会以引用计数为零结束,也不会被删除。如果您的共享指针是循环链接的,那么您的代码可能会发生这种情况。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-24
    • 2021-12-30
    • 2018-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-01
    相关资源
    最近更新 更多