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