对不起我的英语。我有相同的代码:
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());
这里有几个问题。第一个是评论中指出的,Edgar Rokyans答案是您将ListModel
作为 shared_ptr
创建为null,这首先是通过用make_shared
auto ListModel = std::make_shared<QStandardItemModel>();
更险恶的错误是您在循环中创建元素,然后将非持有的指针传递给ListModel
,当Items
的destructor运行时,在循环末尾变得无效。QStandardItemModel
的定义是为删除其具有的项目,因此您不应该在将项目传递之前使用shared_ptr
分配。而不是分配并调用appendRow
。另外,您正在将windowsStack
中的CC_9收到的内容包装,但是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));
}
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的答案以获取更多详细信息。