【问题标题】:App crashing when using push_back method for a vector of smart pointers对智能指针向量使用 push_back 方法时应用程序崩溃
【发布时间】:2019-12-28 07:57:50
【问题描述】:

我有一个用于分配的测试应用程序,我必须将共享指针推回共享指针向量。但是它在 push_back 上崩溃了,我不知道为什么。

我尝试移动 shared_ptr 而不是将其复制到向量中,但仍然看到同样的问题。我尝试调试该问题,但由于某种原因,在我单击它们后变量未显示在调试器中(可能是 IDE 问题)。我确实在堆栈溢出上看到了类似的问题,但这与调用 push_back 之前正在初始化共享指针不同。

//Fill - will loop through and ask the user what elements to add
void fill(std::vector<std::shared_ptr<Test>> &vec, int num)
{
    for(int i {1}; i <= num; i++)
    {
        std::cout << "Enter data pointer [" << i << "] : ";
        int data {};
        std::cin >> data;
        std::shared_ptr<Test> data_ptr = std::make_shared<Test> (data);
        std::cout << "Created shared pointer for " << data_ptr->get_data() << 
        std::endl; //debug
        vec.push_back(std::move(data_ptr));
        std::cout << "Added to vector" << data_ptr->get_data() << std::endl; 
        //debug (crash issue is with the pushback method)
    }
}

在创建 shared_ptr 并且 push_back 方法似乎没有执行时,程序崩溃。我添加了 cout 调试消息来尝试查看程序在此函数中的哪个位置失败。调用了“创建的共享ptr”,但没有调用“添加到向量”。

【问题讨论】:

  • 什么是Test?另外,get_data() 是什么?我不认为它是std::shared_ptr API...的一部分...
  • 您在控制台中看到了吗? std::cout &lt;&lt; "Created shared pointer for " &lt;&lt; data_ptr-&gt;get_data() &lt;&lt; std::endl;
  • get_data() 正在返回作为 Test 类的一部分存储的 int。我看到了“为” cout 文本创建的共享指针。

标签: c++


【解决方案1】:

当您从 shared_ptr 移动时,移动的变量无效(在本例中为 null)。

你在推送之前调用data_ptr-&gt;get_data(),这很好。但是在你推送(通过移动)调用data_ptr-&gt;get_data() 之后,第二次将使用(现在移动的)智能指针 - 因此你的崩溃。

【讨论】:

  • 谢谢你们的cmets,我已经固定了。在上面睡觉后,我注意到我最初创建向量的方式是不正确的,并且在将对象放入该向量时它会崩溃。我已经解决了这个问题,我的程序现在可以运行了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-13
  • 1970-01-01
  • 2018-05-28
  • 1970-01-01
  • 2015-06-10
相关资源
最近更新 更多