智能指针.Qt测试

1、Qt598x64vs2017(或 Qt598x86vs2015[配置使用vs2017])、Win10x64

2、测试代码:

 2.1、MainWindow.h

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private:
    int Fidx;
    QVector<std::shared_ptr<SmartPtr>> Fvtr;
    //QVector<std::unique_ptr<SmartPtr>> Fvtr;

private slots:
    void on_pbtnSmartPtrAdd_clicked();
    void on_pbtnSmartPtrDel_clicked();
};

class SmartPtr
{
public:
    SmartPtr(int i):Fi(i){ qDebug()<< "SmartPtr(...) :" << Fi; }
    ~SmartPtr(){ qDebug()<< "~SmartPtr(...) :" << Fi;  }

private:
    int Fi;
};

 2.2、MainWindow.cpp

void MainWindow::on_pbtnSmartPtrAdd_clicked()
{
    Fidx ++;
    std::shared_ptr<SmartPtr> ptr = std::make_shared<SmartPtr>(Fidx);
    //std::unique_ptr<SmartPtr> ptr = std::make_unique<SmartPtr>(Fidx);
    Fvtr.append(ptr);
}

void MainWindow::on_pbtnSmartPtrDel_clicked()
{
    if (Fvtr.count() > 0)
    {
        std::shared_ptr<SmartPtr> ptr = Fvtr.at(0);
        //std::unique_ptr<SmartPtr> ptr = Fvtr.at(0);
        Fvtr.removeAt(0);
        qDebug() << "after QVector<std::shared_ptr<SmartPtr>>::removeAt(0)";
    }
}

 2.3、控制台输出:

  ZC:前3条是 点击"pbtnSmartPtrAdd"打印出来的信息,后6条是 点击"pbtnSmartPtrDel"打印出来的信息

  ZC:Fvtr.removeAt(0); 后没有 立即析构SmartPtr,是在函数结束时才析构SmartPtr的 

SmartPtr(...) : 2
SmartPtr(...) : 3
SmartPtr(...) : 4
after QVector<std::shared_ptr<SmartPtr>>::removeAt(0)
~SmartPtr(...) : 2
after QVector<std::shared_ptr<SmartPtr>>::removeAt(0)
~SmartPtr(...) : 3
after QVector<std::shared_ptr<SmartPtr>>::removeAt(0)
~SmartPtr(...) : 4

3、可以看到,我代码上 有注释掉 std::unique_ptr的使用(我这里的使用 是和std::shared_ptr一样的),改成 std::unique_ptr 那样的话 编译会报错:

 

 

4、

5、

原文地址:https://www.cnblogs.com/cppskill/p/11897513.html