• 9772阅读
  • 7回复

关于QT中自动删除指针的问题 [复制链接]

上一主题 下一主题
离线jamesfancy
 
只看楼主 正序阅读 楼主  发表于: 2008-06-19
— 本帖被 XChinux 执行加亮操作(2008-06-24) —
在生成对象的时候如果指定了Parent的话,这个对象在Parent析构的时候会被自动删除,比如

class MyDialog : public QDialog {
public:
    MyDialog();
    ~MyDialog();
    QLabel* m_Test;
}

MyDialog::MyDialog()
: QDialog(NULL, Qt::CustomizeWindowHint | Qt::WindowTitleHint
                  | Qt::WindowSystemMenuHint | Qt::MSWindowsFixedSizeDialogHint),
{
    m_Test = new QLable(tr("Testing", this);
}

MyDialog::~MyDialog() {
    delete m_Test;
}

从代码来看,m_Test因为指定了当前Dialog为Parent,所以它会在当前对话框析构的时候被delete掉。这个步骤应该是QDialog或者其父类的析构函数中完成的。
但为什么MyDialog的析构中再一次delete m_Test的时候,却不会出错呢?
反过来,先delete m_Test,再由QDialog的父类析构再delete一次也是一样。
如果一个指针被delete两次是一定要抛出异常的啊?!

离线foxyz

只看该作者 7楼 发表于: 2008-06-25
前边有人说了,Qt4.3的sharedPointer问题。确实,Qt大部分类都有自动pointer管理功能,但是你自己实现的除外,你如果
想自己的类也能使用sharedpointer那么如下处理:
class yourclass : public QSharedData
{
    ...
}
typedef QSharedDataPointer<yourclass> YourClassP;


使用的时候:
YourClassP cp;
cp = new yourclass;

值得注意的问题:
一般使用这个机制主要用于容器中的元素操作。某些情况下,该对象会析构后重新构造,从而丢失原对象的指针。
因此不要过多地拷贝该对象。
离线steinlee

只看该作者 6楼 发表于: 2008-06-25
Do not try  to delete that pointer. If you want to see if there is duplicate delete, use valgrind to run your code (on Linux)to see if you have problem.
Looking for remote C/C++ and Qt 兼职
离线linshihaoma

只看该作者 5楼 发表于: 2008-06-24
三点:
    一、qt有自己的垃圾回收机制,凡是继承自QObject的类都有这个机制。正如楼主所说,凡是设置了parent的
QObject的子类,在parent删除时会自动删除以其为parent的子控件。
  二、是得先搞清楚C++,qt的垃圾回收也是通过C++语法实现的,但是,懂C++了不看相关文档还是不会懂qt的垃圾回收
  三、重复删除的问题,我也正在看,我估计是QT内部的指针删除前会有判断,如果已经删除就不用在删除了。
[ 此贴被linshihaoma在2008-06-24 20:03重新编辑 ]
离线foxyz

只看该作者 4楼 发表于: 2008-06-24
还是先搞清楚C++,打好C++基础再继续
离线foxyz

只看该作者 3楼 发表于: 2008-06-24
不清楚你想问什么.你的代码没问题.你new出来的当然得你自己delete啊!关this指针什么事
离线xjcook

只看该作者 2楼 发表于: 2008-06-22
第一,你调式运行下看出错不。
第二,你那个MyDialog删除是不是主程序就退出了,你再建立一个dialog,在主程序中调用,
把你的m_Test的parent指定为这个dialog,然后删除它,在主程序不退出的情况下看是不是非法。
离线ynshisss

只看该作者 1楼 发表于: 2008-06-19
你没看到错误并不能证明没错
我估计在父类析构时delete后,把他指向了NULL
所以最好在你写的析构函数中加入
MyDialog::~MyDialog() {
    delete m_Test;
    m_Test = NULL;
}

我曾经在一个C++程序中调用C写的库,其中要用到C头文件中的一个结构体,
首先定义一个该结构体指针A,为该指针分配完空间,然后使用它,最后释放掉A,
但是没有将它指向NULL,我想它已经释放掉了,自己就是NULL了,但下次判断
if(A == NULL)时,结构A不等于NULL
快速回复
限100 字节
 
上一个 下一个