繁体   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