明智的指针代替指针

smart pointers instead of pointers

本文关键字:指针      更新时间:2023-10-16

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

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的答案以获取更多详细信息。