gpt4 book ai didi

c++ - QT Image Viewer 示例,可能的内存泄漏?

转载 作者:行者123 更新时间:2023-11-30 04:51:59 29 4
gpt4 key购买 nike

A Image Viewer Example QT 文档网站上包含以下代码片段:

ImageViewer::ImageViewer()
: imageLabel(new QLabel)
, scrollArea(new QScrollArea)
, scaleFactor(1)
{
imageLabel->setBackgroundRole(QPalette::Base);
imageLabel->setSizePolicy(QSizePolicy::Ignored, QSizePolicy::Ignored);
imageLabel->setScaledContents(true);

scrollArea->setBackgroundRole(QPalette::Dark);
scrollArea->setWidget(imageLabel);
scrollArea->setVisible(false);
setCentralWidget(scrollArea);

createActions();

resize(QGuiApplication::primaryScreen()->availableSize() * 3 / 5);
}

其中 imageLabelscrollArea 分别是指向 QLabelQScrollArea 的指针成员。

我知道在 scrollArea->setWidget(imageLabel); 行中,滚动区域拥有 imageLabel 指针的所有权,并在需要时将其删除。对于 setCentralWidget(scrollArea); 也是如此,窗口拥有 scrollArea 的所有权。

但是,在构建过程中,如果imageLabel创建成功,而scrollArea创建失败,那么imageLabel会不会泄露了?

如果是,解决这个问题的规范方法是什么?

最佳答案

我认为有两种方法:

1。使用智能指针而不是原始指针(例如 QPointer)。

    class ImageViewer : public QMainWindow
{
QPointer<QLabel> imageLabel;
QPointer<QScrollArea> scrollArea;
};

在这种情况下,如果 scrollArea 的构造函数(或 ImageViewer 的构造函数主体抛出异常),将调用 imageLabel 的析构函数

2。将内存分配移动到构造函数体内,并用 try/catch block 包装。

    ImageViewer::ImageViewer()
: imageLabel(nullptr)
, scrollArea(nullptr)
, scaleFactor(1)
{
try {
imageLabel = new QLabel();
scrollArea = new QScrollArea();
} catch (std::bad_alloc&) {
delete imageLabel;
delete scrollAreal;
}
// ...
}

可能会找到更多详细信息 here (道德 #4 是关于您的问题)

关于c++ - QT Image Viewer 示例,可能的内存泄漏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54666392/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com