gpt4 book ai didi

c++ - 智能指针而不是指针

转载 作者:行者123 更新时间:2023-11-30 00:45:53 25 4
gpt4 key购买 nike

对不起我的英语。我有相同的代码:

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 时,它在循环结束时变得无效的析构函数运行。 QStandardItemModeldefined to delete the items it has所以你不应该在传递项目之前使用 shared_ptr 来分配项目。而只是分配并调用 appendRow。此外,您将从 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));
}

关于c++ - 智能指针而不是指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41136103/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com