[英]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.