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、