c++ - 对象的所有权 - 哪个小部件应该删除它?

标签 c++ qt pointers qwidget ownership

我有一组具有复杂关系的小部件。其中一个必须创建一个项目,我认为必须将其存储为指针。另一个是稍后创建的,接收指向项目的指针 - QGraphicsScene - 并将其放置在 View 中。

问题:关闭时,谁(如果有的话)应该删除该项目?


Widget:包含对 QGraphicsScene* m_scene(派生类)及其项目进行更改的 gui 元素。
MainWidget:包含一个放置Widget 的滚动区域,一个包含QGraphicsView 的滚动区域,以及一个工具箱。 (它被设计成可以被不同的小部件重用)

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Widget* w = new Widget();
    MainWidget m(w);
    m.show();
    return a.exec();
}

MainWindow:: MainWindow(Widget *contentWidget, QWidget *parent) : QWidget(parent),
    ui(new Ui:: MainWindow), 
    m_contentWidget(contentWidget), 
    m_canvas(contentWidget->getCanvas())
{
    ui->setupUi(this);
    ui->myView->setScene(m_canvas);
    ui->editArea->insertWidget(0, m_contentWidget);
}

两个类都有

MyCanvas *m_canvas;

那么 - 在关闭时 - 应该删除哪个小部件 m_canvasWidget 类,谁是所有者,或者 MainWidget 类,它包含持有场景的 View ?

(在 Widget - 逻辑所有者 - 中删除它会使程序崩溃,我的猜测是因为 MainWidget 仍然需要它作为 ui 的一部分)

最佳答案

指针的所有者 是应该执行删除的人。您已确定 Widget 是所有者,因此应由它删除资源。


Widget 是所有者似乎是合理的,因为 m_canvas 是使用 contentWidget->getCanvas() 初始化的(其中 contentWidget 属于 Widget) 类型,这让我假设 Widget 也是调用 new 运算符的类型。

关于c++ - 对象的所有权 - 哪个小部件应该删除它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38273188/

相关文章:

qt - 如何在Qt中为不同的按钮设置不同的图标?

c++ - 带有几个图标和文本的复杂按钮

c - 从文件读取最后 n 个字节时出现段错误

c++ - 即使类不包含数据,C++ 14 是否仍会生成默认函数?

c++ - QT服务器端写函数有错误(在线程0中停止...)

pointers - 在子例程中分配数组并将其传回时,FORTRAN 中的内存泄漏问题

.net - AppDomain 地址空间

c++ - 我不明白 DR 2145 中针对 [dcl.fct.def.general]/2 提出的更改

c++ - Windows Mobile 在 `new` 失败时返回 0

c++ - 我哪里错了?我收到链接器错误( undefined symbol ),我被卡住了