• 5029阅读
  • 6回复

问个最基本的问题.这样不会memory leak吗? [复制链接]

上一主题 下一主题
离线tiancaiamao
 

只看楼主 倒序阅读 楼主  发表于: 2009-08-09
class A:public QDialog
{
public:
    A(QWidget* parent=0);
};
A::A(QWidget parent):QDialog(parent)
{
    Q_OBJECT
    QLabel* label=new QLabel(tr("hello world!"));
}
这是书上最基本的例子.这样不会内存泄露吗?
构造函数中声明的QLabel的指针.这样出了作用域后,label所指向的物件所占的内存不就泄露了吗?
就算写析构函数,这个label指针是构造函数内的局部变量,也传不过去,做不了delete.
我试着用auto_ptr包装label防止内存泄露,结果发现,运行时没有label显示了.
std::auto_ptr<QLabel> label(new QLabel(tr("hello world!"));

这到底是怎么一回事?
是不是与Qt的对象树模型有关?到底是怎么样一种机制,谁能说说吗?
离线watera
只看该作者 1楼 发表于: 2009-08-09
任何一本Qt书上一开始肯定都会讲这个问题。
每个父Object保存了它的子Object的列表,它析构会自动delete子Object
离线dbzhang800

只看该作者 2楼 发表于: 2009-08-09
引用楼主tiancaiamao于2009-08-09 13:04发表的 问个最基本的问题.这样不会memory leak吗? :
class A:public QDialog
{
public:
    A(QWidget* parent=0);
};
A::A(QWidget parent):QDialog(parent)
{
    Q_OBJECT
    QLabel* label=new QLabel(tr("hello world!"));
}
.......


你确定你这是书中的完整例子! 个人感觉你写的这个要内存泄露的。

不过一般用的时候都是用QLayout来进行布局的,在布局的过程中,会重定义父对象。 然后就是楼上说的那种情况了
离线tiancaiamao

只看该作者 3楼 发表于: 2009-08-09
确实....书上有用过QLayout布局过....我只是感觉有疑问,大致挑的一部分代码表示的.
我Qt初学者,大家莫笑啊.....
嘿嘿.要好好看一下Qt对象模型了.
离线tiancaiamao

只看该作者 4楼 发表于: 2009-08-11
为什么所有的物件都是用new声明的,不是用局部变量呢?
[ 此帖被tiancaiamao在2009-08-11 12:42重新编辑 ]
离线dbzhang800

只看该作者 5楼 发表于: 2009-08-11
用 new 的话,你的头文件中不必包含相应的Qt头文件了,只需要使用前置声明就够了。使用前置声明,可以使编译过程更快。

其他好处我不也太清楚,期待其他人指点
离线tiancaiamao

只看该作者 6楼 发表于: 2009-08-11
楼上说的我的懂...学C++的都知道.只是LS没明白我的意思.
现在我自己找到答案了:
非模态对话框如果是栈对象,当代码退出对话框的作用域后,该对话框就自动销毁了.
快速回复
限100 字节
 
上一个 下一个