明智的指针代替指针
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的答案以获取更多详细信息。
相关文章:
- 1d 智能指针不适用于语法 (*)++
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 为什么使用 "this" 指针调用派生成员函数?
- 函数向量_指针有不同的原型,我可以构建一个吗
- 使用指针从C++中的数组中获取最大值
- 助记符和指向成员语法的指针
- 嵌入方指针压缩已禁用
- 数组的指针从不分段故障
- C++ 指针的内存地址和指向数组的内存地址如何相同?
- 何时在引用或唯一指针上使用移动语义
- QMetaObject invokeMethod的基于函数指针的语法
- 如何从 std::atomic 中提取指针 T<T>?
- 如何在 C# 中映射双 C 结构指针?
- C++将浮点指针值舍入为小数位数
- 为什么++(*p)更改指针值
- 调整大小后指向元素值的指针unordered_map有效?
- 正在将指针转换为范围
- 使用指向成员的指针将成员函数作为参数传递
- 将OpenCV C++重写为EmguCV C#-如何使用指针
- C++-试图将函数指针推回到另一个CPP文件中的矢量时出错