【问题标题】:memory leak after clearing vector of shared pointer清除共享指针向量后的内存泄漏
【发布时间】:2023-03-15 23:59:02
【问题描述】:

我有一个这样的共享指针向量:

vector <shared_ptr<PhotoWidget>> photoWidgets;
PhotoWidget *photoWidget = new PhotoWidget;
photoWidget->setup(widget);
photoWidgets.emplace_back(move(photoWidget));

我需要清除内存,但找不到正确的方法,我阅读了类似的主题,但注意到对我有用,到目前为止我使用此代码没有任何成功。

for( auto&& widget : photoWidgets ) {
    widget.reset();
}
vector<shared_ptr<PhotoWidget>>().swap(photoWidgets);
photoWidgets.clear();
photoWidgets.shrink_to_fit();

PhotoWidget 类是:

#include "ofMain.h"
#include "baseWidget.h"
#include "../lib/json.hpp"

using json = nlohmann::json;

class PhotoWidget: public BaseWidget {
public:
    void setup(json config);
    void update();
    void draw();
    void loadNewPhoto(json data);
    void loadDefaultPhoto();

    ofImage image;
    bool defaultPhotoRunning = true;
    uint64_t lastElapsedTimeMillis;
    uint64_t interval;
};    

【问题讨论】:

  • 您是如何确定内存泄漏的?
  • 附带说明 - 智能指针的目的是自己释放内存。
  • @juanchopanza 在 linux 中使用 top 命令,我有一个用于清除和重新填充向量的外部触发器,当我使用触发器时,我可以看到应用程序的内存以不可接受的量增加
  • @nim4n 这不一定是检查内存泄漏。这只是意味着运行时尚未归还程序已释放的所有内存。
  • 您可以使用 valgrind 等专用工具来告诉您是否有内存泄漏。

标签: c++ c++11 vector memory-leaks shared-ptr


【解决方案1】:

我发现了问题,我改变了这部分:

PhotoWidget *photoWidget = new PhotoWidget;
photoWidget->setup(widget);
photoWidgets.emplace_back(move(photoWidget));

到这里,问题就解决了:

photoWidgets.emplace_back(make_shared<PhotoWidget>());
photoWidgets[widget["ID"]]->setup(widget);

在这种情况下,在变量中创建新指针似乎无法正常工作。

【讨论】:

  • 为什么要使用 move 而不仅仅是 photoWidgets.push_back(make_shared());
猜你喜欢
  • 2013-10-20
  • 2015-05-26
  • 2014-08-13
  • 1970-01-01
  • 2013-08-25
  • 2019-04-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多