我有一个GUI应用程序,其中包含用于显示许多模拟蚂蚁的CVIEW。
i创建一个shared_ptr的向量来保存仿真控制器(如果我打算打开更多视图,则有很多(。每个控制器都包含许多依赖循环的共享_ptr。
启动仿真时,我打开任务管理器并查看程序内存的增加,直到程序停止(例如3000MB(。我关闭所有视图,并调用创建的重置方法,以清除用于存储输入和输出数据以及控制器的所有容器或向量。但是,我仍然看到3000MB没有更改为3MB或任何其他类似较小的数字。
我有记忆泄漏吗?因为如果我再次开始运行模拟,则所述的记忆将变为越来越大的数字,而我认为调用清除方法后应重置为最低的数字。
循环共享指针最终不会被删除。考虑以下内容:
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;
毕竟,foo1
和foo2
指向 - 彼此之间。因此,共享指针都不会以零的参考计数最终删除。如果您的共享指针循环链接,则可能是您的代码的情况。