簡體   English   中英

將Qt對象與std :: shared_ptr一起使用

[英]using Qt objects with std::shared_ptr

我正在嘗試將一個小實用程序應用程序更新為更現代的C ++方式,但是我在使用std :: shared_ptr的一些Qt對象時遇到了問題,特別是那些接收其他QWidget作為構造函數參數的那些。

例如:

private:
    std::shared_ptr<QWidget> centralwidget;
    std::shared_ptr<QVBoxLayout> verticalLayout;

public:
    void setupUi(QMainWindow *MainWindow) // this pointer is a .get() from a shared_ptr
    {
        centralwidget = std::make_shared<QWidget>(new QWidget(MainWindow)); // compiles fine
        verticalLayout = std::make_shared<QVBoxLayout>(new QVBoxLayout(centralwidget.get())); // does not compile
    }

編譯錯誤是:

錯誤1錯誤C2664:'QVBoxLayout :: QVBoxLayout(QWidget *)':無法將參數1從'QVBoxLayout *'轉換為'QWidget *'e:\\ microsoft visual studio 11.0 \\ vc \\ include \\ memory 855

我似乎無法理解這個錯誤,我沒有轉換任何東西,我只是想創建一個QVBoxLayout對象並傳遞一個QWidget作為其父(就像我會用原始指針)。

一般來說,我盡量避免使用shared_ptr用於Qt GUI對象,因為Qt已經提供了自己的內存管理機制。 每個QObject可能都有一個父對象,當這個父對象死亡時,他會刪除它的所有子對象。 這里不需要shared_pointer,也沒有給你任何附加值:你可以完美地使用原始指針而不會產生內存泄漏。

一般來說,如果QObject的父級在刪除最后一個shared_ptr實例之前就死了,那么你很快就會遇到麻煩,因為當最后一個shared_ptr被銷毀時,該對象將被第二次刪除。 這不是這里的情況,但要小心:)

std::make_shared的參數將傳遞給您要實例化的類的構造函數。 所以基本上你所做的相當於:

new QVBoxLayout(new QVBoxLayout(centralwidget.get()))

我想你要做的是:

centralwidget = std::make_shared<QWidget>(MainWindow);
verticalLayout = std::make_shared<QVBoxLayout>(centralwidget.get());

看看std::make_shared的文檔(例如這里 )。 這個函數的重點是在內存中的對象實例附近分配引用計數,所以你必須讓它為你做分配。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM