2016-12-14 134 views
1

对不起,我的英文。我有相同的代码:智能指针代替指针

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()); 

回答

3

这里有几个问题。首先是作为评价和埃德加Rokyans回答指出,您创建ListModelshared_ptr为空用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)); 
} 
+0

谢谢,你有没有写过。错误消失了,但QListView没有被添加。虽然它与裸指针一起工作。 –

+1

你仍然需要最后一行'ui-> listView-> setModel(ListModel.get());'我只是重写了循环,这是有缺陷的。 –

+0

我没有删除最后一行,这就是发生了什么,我在上面的问题中添加了一个新版本。 所以没有添加到qlistview。 –

3
auto ListModel = std::shared_ptr<QStandardItemModel>(); 

在该行创建一个空的共享指针ListModel

尝试更换:

auto ListModel = std::shared_ptr<QStandardItemModel>(new QStandardItemModel()); 

莱恩指出我出去,这是更好地使用std::make_shared,这有助于减少代码量,避免重复内存分配:

auto ListModel = std::make_shared<QStandardItemModel>(); 

注:

我刚刚描述了一个错误。似乎你的代码还有其他问题。查看Ryan的答案以获得更多细节。