• 8067阅读
  • 6回复

这样的指针在父对象析构时能自动回收吗? [复制链接]

上一主题 下一主题
离线kummar
 
只看楼主 倒序阅读 楼主  发表于: 2010-08-18
— 本帖被 XChinux 执行加亮操作(2010-09-01) —
"widget.h"
..............................
class Widget :public QWidget
{
   public:
     Widget(QWidget *parent=0);
    ~Widget();
  private slots:
      void creatLabel();
   private:
     QPushButton *btn;
};
...........................

"widget.cpp"
........................
Widget::Widget(QWidget *parent):QWidget(parent)
{
    Btn=new QPushButton(this);  //这个Btn指针指定了父对象,并且是Widget的成员变量,在父对象析构时,这个指针所指的空间自动回收。
    Btn->setGeometry(QRect(10,10,50,30));
    connect(Btn,SIGNAL(clicked()),this,SLOT(creatLabel()));

}
Widget::~Widget()
{
}

void Widget::creatLabel()
{
    QLabel *label=new QLabel(this);  这个Btn指针也指定了父对象,但不是Widget的成员变量,在父对象析构时,这个指针所指的空间能自动回收的吗?。
   label->setGeometry(QRect(10,50,30,30);
}
..........................................
请大侠解答一下,谢谢
离线xtfllbl

只看该作者 1楼 发表于: 2010-08-18
析构时会回收,既使不写this
上海欢迎您
离线kummar
只看该作者 2楼 发表于: 2010-08-18
引用第1楼xtfllbl于2010-08-18 14:10发表的  :
析构时会回收,既使不写this

没有this应该不行的吧,在《C++ GUI Programming with Qt 4 中文版(第一章至第十章)目录版》中有这样的陈述:QT的父子对象机制简化了内存管理,减少了内存泄漏的危险,需要程序员删除的对象就是我们使用new创建的没有父对象的对象。
我现在的问题就是,新建的对象,他指定了父对象,但不是父对象的成员变量,那当父对象析构时会删除这个对象吗?
离线zhuhehz

只看该作者 3楼 发表于: 2010-08-18
1楼,2楼哪位说得对呢?等高人。
离线xinqingfly

只看该作者 4楼 发表于: 2010-08-19
感觉应该会一起释放的吧
菜鸟也是鸟
离线paranoid
只看该作者 5楼 发表于: 2010-08-19
QObject中有两个重要的成员负责组织起整个家族链,parent,它保存着此QObject父亲的指针,children,它是一个列表,包含此QObject的所有孩子的指针。
new一个QObject的时候如果指定了父亲,就会使自己的parent指向父亲,父亲的children中包含自己;
而当一个QObject将要被delete时,它会先通过children找到自己所有的孩子,并逐一delete;然后通过parent查看自己是否有父亲,如果有,则将自己从父亲的children列表中删除;

这样问题就很清楚了,不指定父亲的 new QObject不会被自动delete;指定了父亲则当父亲被delete时自动被delete,并且这跟他是不是成员变量没有关系,因为这种父子关系是保存在QObject类中的,只要是QObject的子类都会遵循这一原则。
离线kummar
只看该作者 6楼 发表于: 2010-08-19
引用第5楼paranoid于2010-08-19 11:25发表的  :
QObject中有两个重要的成员负责组织起整个家族链,parent,它保存着此QObject父亲的指针,children,它是一个列表,包含此QObject的所有孩子的指针。
new一个QObject的时候如果指定了父亲,就会使自己的parent指向父亲,父亲的children中包含自己;
而当一个QObject将要被delete时,它会先通过children找到自己所有的孩子,并逐一delete;然后通过parent查看自己是否有父亲,如果有,则将自己从父亲的children列表中删除;
这样问题就很清楚了,不指定父亲的 new QObject不会被自动delete;指定了父亲则当父亲被delete时自动被delete,并且这跟他是不是成员变量没有关系,因为这种父子关系是保存在QObject类中的,只要是QObject的子类都会遵循这一原则。

恩,说的很清楚,谢谢指点
快速回复
限100 字节
 
上一个 下一个