[英]smart pointers instead of pointers
對不起我的英語不好。 我有相同的代碼:
auto windowsStack = m_windowManger->windowsStack();
auto ListModel = new QStandardItemModel();
while(!windowsStack.empty())
{
auto window = windowsStack.top();
auto title = QString::fromUtf8(window->title().c_str());
auto Items = new QStandardItem(title);
ListModel->appendRow(Items);
windowsStack.pop();
}
ui->listView->setModel(ListModel);
一切正常,我的任務是將指針替換為智能指針。 我的決定不止一次:
auto windowsStack = m_windowManger->windowsStack();
auto ListModel = std::shared_ptr<QStandardItemModel>();
while(!windowsStack.empty())
{
auto window = std::shared_ptr<Window>(windowsStack.top());
auto title = QString::fromUtf8(window->title().c_str());
auto Items = std::shared_ptr<QStandardItem>(new QStandardItem(title));
ListModel->appendRow(Items.get());
windowsStack.pop();
}
ui->listView->setModel(ListModel.get());
但是最后,我得到消息:該程序意外結束。 在提示符下,鍵入:
ListModel->appendRow(Items.get());
新版本:
auto ListModel = std::make_shared<QStandardItemModel>();
while(!windowsStack.empty())
{
auto window = windowsStack.top();
windowsStack.pop();
auto title = QString::fromUtf8(window->title().c_str());
ListModel->appendRow(new QStandardItem(title));
}
ui->listView->setModel(ListModel.get());
auto ListModel = std::shared_ptr<QStandardItemModel>();
在這一行,您將創建一個空的共享指針ListModel
。
嘗試替換為:
auto ListModel = std::shared_ptr<QStandardItemModel>(new QStandardItemModel());
正如Ryan指出的那樣,最好使用std :: make_shared ,這有助於減少代碼量並避免冗余的內存分配:
auto ListModel = std::make_shared<QStandardItemModel>();
注意:
我剛剛描述了一個錯誤。 似乎您的代碼中還有其他問題。 查看Ryan的答案以獲取更多詳細信息。
這里有兩個問題。 如評論和Edgar Rokyans答案中所指出的,第一種方法是將ListModel
創建為shared_ptr
為null,這首先通過使用make_shared
分配項來解決。
auto ListModel = std::make_shared<QStandardItemModel>();
更危險的錯誤是,您正在循環中創建元素,然后將非所有者指針傳遞給ListModel
,這些指針在Items
的析構函數運行時在循環結束時變得無效。 QStandardItemModel
的定義是刪除它擁有的項目,因此在傳遞項目之前,您不應該使用shared_ptr
來分配項目。相反,只需分配並調用appendRow
。 另外,您將從windowsStack
獲得的內容windowsStack
在shared_ptr
,但是windowsStack
似乎是擁有指針堆棧的副本,因此這很奇怪。 我不確定,但是看起來您實際上想要在這里使用原始指針,或者使windowsStack
成為shared_ptr
的堆棧。 我不確定,因為我不知道windowsStack()
返回什么-它可能是擁有原始指針的堆棧,這些原始指針指向調用者應該刪除的動態分配的內存。
while(!windowsStack.empty()) {
auto window = windowsStack.top();
windowsStack.pop();
auto title = QString::fromUtf8(window->title().c_str());
ListModel->appendRow(new QStandardItem(title));
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.