簡體   English   中英

智能指針而不是指針

[英]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獲得的內容windowsStackshared_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.

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