Qt中类成员变量的内存管理

时间:2012-12-07 15:26:32

标签: c++ qt memory-management qgraphicsscene

我正在使用基于Qt的QGraphicsScene功能的Qt编写图像查看器。我正在一个名为ImageModel的类中创建每个图像的模型,并在名为ImageView的类中管理图像的显示。 ImageView类如下(只是有趣的部分):

class ImageView
{
public:
    ImageView(QWidget *parent);

    QGraphicsView * getView() {return view; }

private:

    //qgraphics scene elements
    QGraphicsScene *scene;
    QGraphicsView *view;
    QGraphicsPixmapItem *curItem;


};

该类的构造函数如下:

ImageView::ImageView(QWidget *parent)
{

    //create scene and view with parent the main window
    //such that the memory management is done by qt
    scene = new QGraphicsScene(parent);
    view = new QGraphicsView(parent);

    view->setScene(scene);
}

在我推导QMainWindow的过程中,我也有指向ImageView的指针。

我的问题是:我应该让Qt通过将我的主窗口设置为视图和场景的父窗口来进行内存管理,还是应该自己处理内存管理(离开视图和没有父项的场景并删除它们)在类析构函数中)?在这种情况下,什么是好策略?

3 个答案:

答案 0 :(得分:0)

如果您不再需要它们,您是否有理由在父母的整个生命周期内保留它们?如果没有,我不明白你为什么要保留分配的内存。

如果你不再需要资源,你应该释放它,除非你有理由不这样做。请注意,您可以删除它们,无论它们是否有父母;当您删除具有父项的对象时,它会从父项的子项列表中删除它。

答案 1 :(得分:0)

如果您希望视图嵌套在主窗口中,那么您将 使其成为一个孩子。

对于您的一般问题,这实际上归结为您期望的对象生命周期和所有权语义。如果你不希望视图/场景比主窗口寿命更长那么它们应该是孩子们。您仍然可以选择在较早时间通过其他方式删除它们。

答案 2 :(得分:0)

让Qt负责删除。它方便又安全。不要在你不需要的地方附上参考。例如,添加布局并保留仅用于删除的引用是不值得的。