查看完整版本: [-- QSharedPointer 的问题 --]

QTCN开发网 -> Qt基础编程 -> QSharedPointer 的问题 [打印本页] 登录 -> 注册 -> 回复主题 -> 发表主题

luhaoting110 2013-05-15 14:01

QSharedPointer 的问题

  1. QList< QList< QSharedPointer<QGraphicsItem> > > history;
这是为history加入内容
  1. QList<QSharedPointer<QGraphicsItem > > item_list;
        QSharedPointer<QGraphicsItem > item_cell;
        for(int i = 0 ;i < items(Qt::AscendingOrder).size() ; i++)
        {
            item_cell = QSharedPointer<QGraphicsItem>(items(Qt::AscendingOrder)[i]);
            item_list.append(item_cell);
        }
        history.append(item_list);

  1. for(int i=0 ; i < history.size() ; i++)
                {
                    qDebug()<<"***********这是第"<<i<<"个链表********";
                    qDebug()<<"此项长度为"<<history[i].size()<<"\n";
                    for(int j = 0 ;j < history[i].size();j++)
                    {qDebug()<<history[i][j].data();}
                    qDebug()<<"-------------------------------------";
                 }
                //delete_itemList(history.last());
                history.removeLast();
                for(int i=0 ; i < history.size() ; i++)
                {
                    qDebug()<<"***********这是第"<<i<<"个链表********";
                    qDebug()<<"此项长度为"<<history[i].size()<<"\n";
                    for(int j = 0 ;j < history[i].size();j++)
                    {qDebug()<<history[i][j].data();}
                    qDebug()<<"-------------------------------------";
                 }

为什么我在没有removeLast();之前可以遍历 ,之后遍历就挂了,难道QSharedPointer帮我delete了?




下面是打印
  1. ***********这是第 0 个链表********
    此项长度为 2

    QGraphicsObject (this = 0x126d208 , parent = 0x0 , pos = QPointF(0, 0) , z = 0 , flags =  ( ItemIsFocusable ) )
    QGraphicsItem (this = 0x1359d24 , parent = 0x0 , pos = QPointF(0, 0) , z = 0 , flags =  ( ) )
    -------------------------------------
    ***********这是第 1 个链表********
    此项长度为 3

    QGraphicsObject (this = 0x126d208 , parent = 0x0 , pos = QPointF(0, 0) , z = 0 , flags =  ( ItemIsFocusable ) )
    QGraphicsItem (this = 0x1359d24 , parent = 0x0 , pos = QPointF(0, 0) , z = 0 , flags =  ( ) )
    QGraphicsItem (this = 0x1359ae4 , parent = 0x0 , pos = QPointF(0, 0) , z = 0 , flags =  ( ) )
    -------------------------------------
    ***********这是第 0 个链表********
    此项长度为 2
这里就挂了


dbzhang800 2013-05-16 09:34
引用楼主luhaoting110于2013-05-15 14:01发表的 QSharedPointer 的问题 :
为什么我在没有removeLast();之前可以遍历 ,之后遍历就挂了,难道QSharedPointer帮我delete了?


对。因为你错误地新建了多个指向同一个指针的 QSharedPointer,所以任何一个QSharedPointer的析构都会导致该指针无效!!

建议熟悉一下 shared pointer 等智能指针的用法

luhaoting110 2013-05-16 09:44
我有几个问题不懂
首先 Qlist的remove会导致QSharedPointer指针的释放?

其次如果释放了 QSharedPointer的计数器难道不是我这样操作就会累加的嘛?

我的理解是多个QSharedPointer指向同一块内存,QSharedPointer的计数器就加,使用QSharedPointer::clear() 的时候计数器就减少直至为0 的时候就释放这个内存。

dbzhang800 2013-05-16 12:32
引用第2楼luhaoting110于2013-05-16 09:44发表的 回 1楼(dbzhang800) 的帖子 :
我有几个问题不懂
首先 Qlist的remove会导致QSharedPointer指针的释放?
其次如果释放了 QSharedPointer的计数器难道不是我这样操作就会累加的嘛?
.......

在用法正确的情况下确实如此。

问题在于你对同一个指针创建了若干个独立的 shared pointer,使得你的列表中保存的每一个shared pointer 引用计数都为1


题外:
对于Qt中这种有父子关系的QObject的指针,使用shared pointer需要更小心一些。或许QPointer或QWeakPointer更合适一些

luhaoting110 2013-05-16 12:41
懂了 !谢谢大神指点


查看完整版本: [-- QSharedPointer 的问题 --] [-- top --]



Powered by phpwind v8.7 Code ©2003-2011 phpwind
Gzip disabled