智能指针.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、