创建类时我应该在哪里放置new / delete

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了创建类时我应该在哪里放置new / delete相关的知识,希望对你有一定的参考价值。

我有一部分代码,我测试和工作,现在我想让它成为一个类,以便有一些更清洁的东西。以下代码创建一个包含矩形的场景,并将其显示在窗口小部件'graphicview'上

QGraphicsScene *scene = new QGraphicsScene;
QGraphicsRectItem *rect = new QGraphicsRectItem();
rect->setRect(0,0,100,100);
scene->addItem(rect);
ui->graphicsView->setScene(scene);

我现在想要创建一个包含这个场景的类,所以我只需要调用:

MyClass *myscene = new MyClass;
ui->graphicsView->setScene(myscene->scene)

在MyClass类中,我将有一个私有参数声明为QGraphicsScene *scene = new QGraphicsScene;,或者只是私有参数QGraphicsScene *scene,然后在构造函数*scene=new QGraphicsScene

在MyScene的析构函数中我应该删除的位置一样吗?

编辑:基于答案,我尝试在没有new的情况下重新编写代码:

QGraphicsScene scene;
QGraphicsRectItem rect;
rect.setRect(0,0,100,100);
scene.addItem(&rect);
ui->graphicsView->setScene(&scene);

但是这段代码不起作用(widget'graphoutView'什么都没显示),我发现Qt的所有例子都使用new运算符。我错过了什么?

答案

避免(原始)指针与性能和清晰度考虑因素一样多。例如,在您的代码中,没有必要使用指针。而是将您的场景定义为您的类的成员:

class MyCalss
{
...
  QGraphicsScene scene;
};

然后将其设置为视图:

MyClass myscene;

ui->graphicsView->setScene(&myscene.scene);

所以,从现在开始,在使用指针之前,先问自己这个问题,是否有必要使用指针?如果你必须使用指针,也可以考虑smart pointers

另一答案

新的和删除没有“特定”的地方。它完全取决于你需要动态分配内存的位置(新),一旦动态分配内存(变量)的作业结束,你需要释放(删除),记住该变量不会在其他任何地方使用因为它会导致不良行为。

如果在创建类的每个对象时,需要在开始时动态分配类变量,请在构造函数中执行。类似地,如果变量在整个对象生命周期中使用,请在析构函数中删除它。这只是一个非常高级的想法。我建议阅读this,并阅读有关指针(智能指针)和动态内存分配的更多信息

以上是关于创建类时我应该在哪里放置new / delete的主要内容,如果未能解决你的问题,请参考以下文章

何时使用 new 运算符创建对象或在测试类时使用自动连线?

类重载 new 和 delete vs 放置 new 与定制的内存类

当一个人创建一个新模型时,应该在哪里放置代码以在 Google App Engine/Django 上自动增加一个分片计数器?

我应该在哪里放置包含我在laravel项目层级文件夹中的数据库播种器中使用的记录的.sql文件

如果涉及访问外部API(域驱动设计),我应该在哪里放置值对象创建逻辑]] << [

Python之元类